重点学习内容
动态内存管理四大函数
Malloc 内存申请函数
返回值是无类型的指针,指向分配的内存的首地址。申请失败会返回空指针。
malloc返回值是void*类型,使用时需要强制转换成所需类型。
malloc和free匹配使用,但是如果不free释放内存,内存也会在程序运行结束后自动释放。
但是程序如果是不停止的运行的话,则最好使用free搭配来释放内存。
搭配free使用的方式:
释放空间使用free(p);p=null;
因为p指针释放内存后,所指向空间使用权交还给系统,但是原来p指针变量内存储的指向的空间的地址还存在p当中,此时p解引用还是可以访问所指向空间,成为野指针。所以最好在free后给p赋空值。
free释放的内存必须是动态内存分配的内存。
calloc 开辟空间并初始化函数
按照元素个数和大小开辟空间。返回值也是void* 指向开辟好的空间的起始地址。
返回之前会提前把开辟的空间初始化位0,然后再返回。
malloc和calloc的区别就是返回之前是否有初始化开辟的空间。
realloc 动态内存调整函数
当动态分配的内存不够或者过多时,用此函数调整。
内存调整的两种情况:
当追加的连续字节已被占用,则此函数会在堆中找空闲内存,重新分配所需的内存,把原分配内存的内容拷贝到新地址,然后返回新的地址。旧空间不用手动释放,会自动释放。
直接在后面追加内存,并由原地址继续管理。
代码实现扩容的正确方式
为了防止扩容失败后空指针覆盖原指针,所以用新的指针接收realloc的返回值, 并判断是否是空指针,在进行赋值。
补充:变长数组概念
变长数组是在c99标准才支持边长数组,并且边长数组并不意味着长度可变,而是数组长度支持使用变量来表示。