calloc、malloc、realloc函数的区别及用法!
三者都是分配内存,都是stdlib.h库里的函数,但是也存在一些差异。
实例:
int *p = (int *)malloc(20*sizeof(int)); int *pp = (int *)calloc(20, sizeof(int)); int i; printf("malloc申请的空间值:\n\n"); for ( i=0 ; i < 20; i++) { printf("%d ", *p++); } printf("\n\n"); printf("calloc申请的空间的值:\n\n"); for ( i=0 ; i < 20; i++) { printf("%d ", *pp++); } printf("\n");
结果:

int main(void) { const int size = 2000; int *p = (int *)malloc(20*sizeof(int)); int *pp = (int *)realloc(p, size*sizeof(int)); printf("原来的p_Address:%x 扩容后的pp_Address:%x \n\n", p, pp); return 0; }

可从图看出,扩容后地址和原先地址是不一样的,但是这仅仅取决于扩容的内存大小。
实际上:
如果size较小,原来申请的动态内存后面还有空余内存,系统将直接在原内存空间后面扩容,并返回原动态空间基地址;如果size较大,原来申请的空间后面没有足够大的空间扩容,系统将重新申请一块(20+size)*sizeof(int)的内存,并把原来空间的内容拷贝过去,原来空间free;如果size非常大,系统内存申请失败,返回NULL,原来的内存不会释放。注意:如果扩容后的内存空间较原空间小,将会出现数据丢失,如果直接realloc(p, 0);相当于free(p).
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200956.html原文链接:https://javaforall.net
