函数名 | 函数和形参类型 | 功能 | 返回值 |
---|---|---|---|
calloc | void*calloc(unsigned n,unsign size); | 分配n个数据项的内存连续空间,每个数据大小为size | 分配内存单元的起始地址,若不成功,则返回0 |
free | free(void *p) | 释放p所指的内存区 | 无 |
malloc | void*malloc(unsigned size); | 分配size字节的存储区 | 所分配的内存区地址,如内存不够,返回0 |
realloc | void*realloc(void *p,unsigned size); | 将f所指的已分配的内存区的大小改为size,size可比原来分配的空间大或小 | 返回指向该内存区的指针 |
1.malloc
char *p=(char*)malloc(sizeof(char)*n);
申请n个大小为char的内存单元并将地址赋给p;不会初始化。
如果申请失败,则返回0
2,calloc
char*p=(char*)calloc(n,sizeof(char));
申请n个大小为char的内存单元并将地址赋给p;而且已经初始化过。
如果申请失败,则返回0
3,realloc
以为malloc扩容为例:
char *p=(char*)malloc(sizeof(char)*n);
char *q=(char*)realloc(sizeof(char)*n*k);
assert(q!=NULL);
p=q;
在这里是对malloc做k倍扩容处理,我们需要注意,realloc扩容会出现三种情况:
1.没有内存可供使用,则扩容失败,需要assert做特殊处理
2.在原有内存后面扩容,这时q和p的地址相同,不做处理
3.原有内存后面内存不足,这时需要重新开辟一块内存空间,此时的q和p的地址已经不同了,则需要将q的地址赋给p。注意注意注意 这里不需要去释放p,因为realloc内部已经帮助我们去释放过了。
这里我推荐大家使用char* p=(char*)realloc(sizeof(char)*n*k);
这样是直接将realloc扩容好的内存地址直接赋给p;只需要断言防止扩容失败就可以了
char* p=(char*)malloc(sizeof(char)*n);
char* p=(char*)realloc(sizeof(char)*n*k);
assert(p!=NULL);
4,free
free(p);
p=NULL;
这里我们将申请过的内存全部释放,归还给堆区,并将这些指针指向NULL;防止野指针的出现。