1.动态分配和数组的比较:数组方便,简单,但是不灵活会造成很大的浪费,还有就是如果数组开的太小了 没办法容纳后面的数据,这些缺点可以通过动态分配内存来搞定,不过动态分配也有一定的麻烦,易错,而且是那种可能你找好久都不能找出来的错误,因为有指针.
2.相关函数:malloc,free,realloc,calloc.
void malloc(size_t size);//size_t是无符号型
void free(void
point);
void realloc(void ptr,size_t new_size);
void calloc(size_t num_element,size_t element_size);
malloc是分配size个字节连续空间,如果不能分配返回NULL 这些内容不会被初始化
realloc改变prt的大小,改变为new_size个字节,如果是增大的话,保留原先的数据内容,然后增加,如果时间小的话,那么留下的那一段数据内容不变,这里减小的话,只能是释放掉后面的空间.如果不能在原来的内存上操作的话,就会新分配一个new_size的内存,把数据复制过去,这样的话用了realloc之后ptr就不能再用了,得用返回的这个指针了
calloc:分配num_element个数据所需的内存,每个数据的字节是 element_size. 这些内容会被初始化为0
free是释放传入指针所分配的内存,不过这块内存必须是上面三个函数之一分配的,还有就是不能释放一部分,如果想释放一部分可以用realloc函数
分配内存是最好用sizeof,这样移植性好一点,比如malloc(100
sizeof(int));
3.一般错误:I.对NULL指针的解引用(分配之后没有判断是否返回的指针为NULL) II.对分配的内存操作时越界 III释放并非动态分配的内存,试图释放动态分配的内存的一部分 IV.释放的内存继续使用.
4.内存泄露就是该释放的内存没有释放,会导致内存一点点被榨干,直到再次重启程序或计算机.这样的后果可能会导致当前已经完成的工作统统丢失
5.字符串动态分配内存是千万别忘了考虑结尾NUL字符
下面给出一个书上的例子,可以防止那些不检测malloc返回指针是否为NULL的情况
alloc.h
#include
#define malloc //不直接使用malloc
#define MALLOC(num,type) (type )alloc((num)(sizeof(type)))
extern void *alloc(size_t size);
alloc.c
#include

#include”alloc.h”

#undef malloc//注意顺序我一开始把这句放在上面一句的前面结果很诡异的错误.
void alloc(size_t size)
{
void new_mem;
new_mem=malloc(size);
if(new_mem==NULL)
{
printf(“fjkds;afkjds;af”);//自己改成需要的
exit(1);
}
return new_mem;
}

Comments