动态内存相关
一、动态内存空间分布1.堆区.heapmalloc,calloc,realloc,free开辟内存空间---由低地址向高地址进行内存开辟2.栈区(.stack)函数内局部变量的空间----由高地址向低地址局部变量存储地址3.代码区.text---只读4.数据区.data 全局变量普通全局变量静态全局变量静态局部变量二、堆区函数1.malloc(无法初始化是随机值)函数原型void * malloc(size_t size)int *p(int *)malloc(sizeofint*10); if(pNULL)return -1; freep; pNULL; //防止出现野指针2.realloc申请的堆区内存空间不够扩容操作第一种情况原内存空间后未分配内存空间足够大直接在原内存空间后开第二种情况原内存空间后未分配内存空间不足在其他未分配空间直接开辟总字节内存空间将原内存拷贝到新内存空间释放原内存空间第三种情况内存中未分配空间不足以扩容扩容失败realloc返回值为NULLtrealloc(p,size_t size)int *arr(int *)malloc(sizeof(int)*10); assert(arr); //断言若内存分配成功即可继续执行 若不成功则程序终止 printf(内存分配成功开始扩容...\n); //接下来进行扩容操作 int *t(int *)realloc(arr,2*10*sizeof(int)); iftNULL{考虑原空间是否释放,return;} assert(t); arrt; free(arr); arrNULL;缩容原理1.内存块允许分隔分隔剩余部分释放2.内存卡不允许分隔重新找一个小内存将原内存前数据拷贝到小内存中释放原来的大内存释放大内存返回原大内存返回小内存地址3.realloc返回NULL3.calloc(申请的数值被赋值为0)void * calloc(size_t n,size_t size)4.free如何知道要释放的内存的大小free释放的是堆区内存空间与malloc申请的内存空间结构有关申请内存结构指针头部信息size 和 magic用户所需字节数malloc返回的是用户所需字节数起始地址free通过传入一个指针通过指针偏移量获取size知道释放的内存大小编写程序时记录内存起始位置