整理今天的学习内容
1.常见的动态内存的错误
(1)对NULL指针进行解引用操作
(2)对动态开辟空间的越界访问
(3)对非动态开辟内存使用free释放
(4)使用free释放一块动态开辟内存的一部分
(5)对同一块动态内存多次释放
可以在两次释放中间为指针变量p置NULL
(6)动态开辟内存忘记释放(内存泄漏)
2.分析下面程序崩溃原因
GetMemory函数是传值调用,函数结束后变量p销毁,str变量仍然是空指针,空指针指向空间不可访问
出了GetMemory后p数组被销毁,返回数组首元素地址p,此时p指向空间已经不属于当前程序,无法使用,str为野指针
可以在屏幕上打印hello,但动态内存开辟的空间没有回收
释放动态内存开辟的空间后,没有对str置NULL,此时str为野指针,不可使用
3.柔性数组
(1)柔性数组的概念
C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员
例:struct st_type
{
int i;
int a[0];
};
有些编译器会报错无法编译,可改成:
struct st_type
{
int i;
int a[];
};
(2)柔性数组的特点
结构中的柔性数组成员前面必须至少一个其他成员
sizeof返回的这种结构的大小不包括柔性数组所占的内存
包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小
(3)柔性数组的使用
若不使用柔性数组,要达到上面的实现效果可写成:
对比两段代码可见,使用柔性数组能方便内存释放,也有利于减少内存碎片