自学内容网 自学内容网

学习C语言(22)

整理今天的学习内容

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)柔性数组的使用

若不使用柔性数组,要达到上面的实现效果可写成:

对比两段代码可见,使用柔性数组能方便内存释放,也有利于减少内存碎片


原文地址:https://blog.csdn.net/lxl1307/article/details/142690489

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!