C语言动态内存管理

张开发
2026/4/17 7:25:05 15 分钟阅读

分享文章

C语言动态内存管理
1.为什么要动态内存分配C语言中的动态内存开辟可以让程序员自己可以申请和释放空间可以随意地调整内存空间比较灵活。2.malloc 和 freemallocvoid*malloc(size_tsize);功能向内存申请一块连续可用的空间并返回这块空间的起始地址。如果开辟成功则返回这块空间地起始地址开辟失败则返回NULL指针返回值是void* 所以malloc函数并不知道开辟空间的类型具体使用的时候使用者自己来决定如果参数size为0malloc的行为是标准未定义的取决于编译器freevoid*free(void*ptr);free函数用来释放动态开辟的内存如果参数ptr指向的空间不是动态开辟的那free函数的行为是未定义的如果参数ptr是NULL指针则函数什么是也不做也不会报错malloc 和 free的声明都在stdlib.h中#includestdio.h#includestdlib.hintmain(){intnum0;scanf(%d,num);intarr[num]{0};//申请的空间放在栈区int*pNULL;p(int*)malloc(num*sizeof(int));//申请的空间放在堆区if(p!NULL){perror(malloc fail!);return;}free(p);pNULL;}3.calloc 和 realloccallocvoid*calloc(size_tnum,size_tsize);功能函数的功能是将num个大小为size的元素开辟一块空间并且把空间的每个字节初始化为0与函数malloc的区别只在于calloc会在返回地址之前把空间的申请的每个字节初始化为0#includestdio.h#includestdlib.hintmain(){int*p(int*)calloc(10,sizeof(int));if(pNULL){perror(calloc fail);return;}for(inti0;i10;i){printf(%d ,*(p1));}free(p);pNULL;return0;}reallocvoid*realloc(void*ptr,size_tsize);realloc让动态内存管理更加灵活ptr 是要调整的内存地址size 是调整之后的新大小单位是字节返回值是调整之后的内存起始地址这个扩容分为原地扩容和异地扩容原地扩容原有空间之后有足够大的空间异地扩容原有空间之后没有足够大的空间将原有数据拷贝重新创建一个新的数组#includestdio.h#includestdlib.hintmain(){int*p(int*)malloc(100);if(pNULL){perror(malloc fail!);return;}int*tmp(int*)realloc(p,1000);if(tmpNULL){perror(realloc fail);return;}ptmp;free(p);pNULL;return0;}注意不能写成p(int*)realloc(p, 1000);如果realloc失败会返回空指针就找不到原先的指针了所以会导致内存泄露而且成功了之后也不一定会返回原先的指针也找不到原先的指针了。4.柔性数组结构中的柔性数组成员前面必须至少有一个其他成员sizeof 返回的这种结构大小不包括柔性数组的内存包含柔性数组成员的结构用malloc函数进行内存分配并且分配的内存应该大于结构的大小以适应柔性数组的预期大小typedefstructst_type{inti;inta[0];//柔性数组成员里面的0表示任意数组不确定。};柔性数组的使用#includestdio.h#includestdlib.htypedefstructst_type{inti;inta[0];//柔性数组成员里面的0表示任意数组不确定。}type_a;intmain(){inti0;type_a*p(type_a*)malloc(sizeof(type_a)100*sizeof(int));p-i100;for(i0;i100;i){p-a[i]i;}free(p);pNULL;return0;}这样柔性数组a相当于获得了100个整形元素的连续空间。

更多文章