C语言中的内存分配函数主要有malloc、calloc、realloc、free等,关于他们的功能、区别及用法想必不是每个程序员都掌握得很好的,本人也不例外。要找到答案,man手册必然是最权威的资料,下面便是man手册中关于内存分配函数介绍的中文译本。
一、主要功能:分配和释放动态内存。
二、函数声明:
#include <stdlib.h> void *calloc(size_t nmemb, size_t size); void *malloc(size_t size); void free(void *ptr); void *realloc(void *ptr, size_t size);
三、详细介绍:
1、calloc函数申请一个单位长度为size字节,成员个数为nmemb的数组空间,并返回申请到的空间地址。申请的到空间会被置零。如果参数nmemb或者size传入0,calloc函数将返回空指针NULL或者可以被free函数释放的特殊指针。
2、malloc函数申请分配size字节空间并返回空间地址指针,该空间默认不会被清空。如果参数size传入0,malloc函数将返回空指针NULL或者可以被free函数释放的特殊指针。
3、realloc函数用来改变已分配空间的大小,它将分配一个大小为size字节的新空间,将原来空间中的内容拷贝到新空间中,返回新空间地址的指针,拷贝结束后执行free(ptr)函数释放原空间;如果size小于ptr所指向的原空间的大小,realloc函数既不会分配新空间,也不会free原空间,而是直接返回原空间的地址指针;如果参数ptr传入空指针NULL,则等价于执行malloc(size)函数;如果参数size传入0且ptr非空,则等价于执行free(ptr)函数。除非参数为NULL,否则参数ptr必须是malloc、calloc或者realloc返回的结果。
四、malloc、realloc实例:
#include <stdlib.h> #include <stdio.h> #include <string.h> int main(void) { char *a = (char *)malloc(10); memcpy(a, "123456789", 10); printf("[a] addr:%p cnt:%s\n", a, a); char *b = (char *)realloc(a, 5); printf("[b] addr:%p cnt:%s\n", b, b); char *c = (char *)realloc(b, 150000); printf("[c] addr:%p cnt:%s\n", c, c); return 0; } 运行结果: [a] addr:0x8b91008 cnt:123456789 [b] addr:0x8b91008 cnt:123456789 [c] addr:0xb76ef008 cnt:123456789
如果用小于150000很多的数,如15000,则a,b,c的地址都可能相同,这大概是编译器优化的结果吧。所以,在realloc以后请不要多此一举地free原空间地址指针,这很可能导致段错误。
除非注明,文章均为CppLive 编程在线原创,转载请注明出处,谢谢。
代码显示缺失,不知道是不是我的个别情况~
我的空间在香港,很廉价,跑在Windows服务器上,估计是网速慢的原因,北京这边挺正常的,你再刷新看看?
一看到内存就想到谈疼的数组····以前老是因为空指针出错
嘿嘿,兄台的长项是potoshop~