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

c语言中的动态内存管理

在 C 语言中,动态内存管理主要通过以下几个函数实现:

 

一、malloc 函数

 

功能: malloc 函数用于在内存的动态存储区中分配一块长度为 size 字节的连续区域。函数返回一个指向分配区域起始地址的指针,如果分配失败则回 NULL 

示例:

bc3696cca3274504afe31f84d93b1362.png

 

 

 

二、calloc 函数

 

功能: calloc 函数用于在内存的动态存储区中分配 n 个长度为 size 字节的连续区域,并将分配的内存初始化为 0。函数返回一个指向分配区域起始地址的指针,如果分配失败则返回 NULL 。

示例:

abf99b3f90144d10a3ddddd5ec58a248.png

 

 三、realloc 函数

 

 功能: realloc 函数用于调整先前由 malloc 、 calloc 或 realloc 分配的内存块的大小。新的大小由 size 指定。如果新大小大于旧大小,可能会移动内存块以提供更多空间;如果新大小小于旧大小,可能会截断内存块,但不会释放多余的空间。函数返回一个指向调整后内存块起始地址的指针,如果分配失败则返回 NULL 。

示例:

054f67155a5d4276a123a17c9d8cb92b.png


四,free函数

 

在 C 语言中, free 函数用于释放动态分配的内存空间。
 
一、函数原型
 
 void free(void *ptr); 
 
它接受一个参数 ptr ,这是一个指向要释放的内存块的指针。这个指针应该是之前通过 malloc 、 calloc 或 realloc 函数分配的内存的地址。
 
二、使用方法
 
例如:
 
52d97a1006f14b7ab46b0fba0d81f8e5.png
 
 
三、注意事项
 
1. 确保只释放已分配的内存:传递给 free 的指针必须是由动态内存分配函数返回的有效指针,否则可能会导致未定义的行为。
2. 避免重复释放:对同一内存块多次调用 free 可能会导致错误,应该确保只释放一次内存。
3. 释放后避免继续使用指针:释放内存后,指针仍然指向原来的内存地址,但该内存已经不可用。为了避免错误,最好将指针设置为 NULL 。

 

在 C 语言中,使用动态内存管理时常见的错误有以下几种:

 

一、内存泄漏

 

- 表现:申请了动态内存但没有在合适的时候释放,导致内存资源一直被占用,随着程序的运行,可能会耗尽系统。

 二、悬空指针

 表现:指针指向的内存被释放后,指针没有被置为 NULL 或重新赋值,继续使用该指针会导致未定义行为。

-示例:

void danglingPointerExample()

{

    int *ptr = (int *)malloc(sizeof(int));

    free(ptr);

    // 这里 ptr 成为悬空指针

    int value = *ptr; // 错误,未定义行为

}

 

 三、重复释放

 

- 表现:对同一块已经释放过的内存再次调用 free 函数,可能会导致程序崩溃或其他不可预测的结果。

- 示例:

void doubleFreeError()

{

    int *ptr = (int *)malloc(sizeof(int));

    free(ptr);

    // 再次释放

    free(ptr);

}

 

四、内存越界访问

 

- 表现:通过指针访问超出动态分配内存范围的地址,可能会破坏其他内存区域的数据,导致程序出现错误。

- 示例:

void outOfBoundsAccess()

{

    int *ptr = (int *)malloc(5 * sizeof(int));

    // 访问超出分配内存范围的地址

    ptr[10] = 20;

    free(ptr);

}

 

 

 

 


http://www.kler.cn/a/292040.html

相关文章:

  • STM32设计防丢防摔智能行李箱
  • HBase压测 ycsb
  • 大数据实验9:Spark安装和编程实践
  • SpringMVC学习笔记(一)
  • transformers 操作篇
  • Hybird和WebView
  • 面向可信和节能的雾计算医疗决策支持系统的优化微型机器学习与可解释人工智能
  • uni-app应用更新(Android端)
  • C语言预处理详解
  • 彻底解决 node/npm, Electron下载失败相关问题, 从底层源码详解node electron 加速配置
  • 无需更换摄像头,无需施工改造,降低智能化升级成本的智慧工业开源了。
  • ClickHousez中如何定时清理过期数据库?
  • 生信机器学习入门4 - scikit-learn训练逻辑回归(LR)模型和支持向量机(SVM)模型
  • Qt (13)【Qt窗口 —— 颜色对话框 QColorDialog】
  • spring cloud gateway 之删除请求头
  • 【CNN训练梯度裁剪】
  • HarmonyOS $r访问资源
  • MyPrint打印设计器(九)svg篇-圆
  • 【计算机视觉前沿研究 热点 顶会】ECCV 2024中Mamba有关的论文
  • C# NX二次开发-获取体全部面
  • Circuitjs 在线电路模拟器使用指南
  • tomcat日志显示中文乱码的方法解决
  • MySQL基础:索引
  • ESRI ArcGIS Pro 3.1.5新功能及安装教程和下载
  • python常用库学习-Matplotlib使用
  • Redis——BigKey