当前位置: 首页 > news >正文

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

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

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


http://www.mrgr.cn/news/41956.html

相关文章:

  • Kubernetes-环境篇-01-mac开发环境搭建
  • msys2软件包手动安装
  • Stream流的终结方法(二)——collect
  • 【超声波焊接】塑胶紧固件设计参考
  • 第4篇:MSSQL日志分析----应急响应之日志分析篇
  • 874653
  • YOLO11改进|上采样篇|引入CARAFE上采样模块
  • C++-vector模拟实现
  • 【C语言系统编程】【第三部分:网络编程】3.2 数据传输和协议
  • Codeforces Round 922 (Div. 2) D题 Blocking Elements(单调队列优化dp)
  • 优化理论及应用精解【17】
  • 自闭症康复摘帽指数解析:评估儿童康复进展的重要指标
  • CMU 10423 Generative AI:lec18(大模型的分布式训练)
  • D3.js中国地图可视化
  • 如何选择适合的自闭症寄宿学校:费用、评价详细分析
  • 《数据结构》--链表【包含跳表概念】
  • 内部类与类作为成员属性
  • pdf处理1
  • 4.6章节python中空语句pass保留字作用
  • Maven项目管理入门:POM文件详解与依赖管理