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

C语言内存管理说明,存储方式

对于C语言来说,根据分配方式的不同,数据的存储方式如下所示。

从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,例如全局变量,static变量等。在栈上创建。在执行函数时,函数内非static局部变量的存储单元都是在栈上创建的,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中 ,效率很高,但是分配的内存容量有限。从堆上分配,亦称动态内存分配。程序在运行的时候用malloc/relloc/calloc等函数申请的内存,程序员自己负责在何时用free释放内存。动态内存的生存期由程序员决定,使用非常灵活;但同时遇到问题也最多,例如内存泄漏、内存越界、野指针问题;此外即使规避了上述问题,在嵌入式环境下,因为内存较小,碎片化问题也可能导致处理失败。

当然还有一些变量不属于上述区域,如const声明的变量存储在只读存储区,对于单片机往往被分配到FLASH区域。

这里从C语言实例来说明,具体如下所示。

#include #include int ex_val; // 全局变量 int ex_val_init = 100; // 带初始化的全局变量 static int st_val; // 静态变量 static int st_val_init = 100; // 带初始化的的静态变量 int main(int argc, char *argv[]) { int local_val; // 局部变量 static int static_local_val = 0; // 带初始化的静态局部变量 int *p; static_local_val += 1; // 动态内存分配,堆内存 p = malloc(sizeof(int)); if (p != NULL) { *p = 100; printf("*p: %d\n", *p); free(p); p = NULL; } printf("ex_val: %d\n", ex_val); printf("st_val: %d\n", st_val); printf("local_val: %d\n", local_val); printf("static_local_val: %d\n", static_local_val); return 0; }

关于上述代码,执行结果如下所示。

C语言的作用域不仅描述了标识符的可访问的区域,其实也规定了变量的存储区域。

对于变量的初始化问题,全局变量和静态变量在编译时,一般会被编译器默认初始化为0。而局部变量和动态分配的内存则被分配为之前使用过的栈地址和堆地址,内部的值是不确定的。如果不进行初始化,在使用时也没有设置直接就使用作为判断条件,就会出现偶发性的出错问题。这个问题其实解释清楚涉及软件平台、编译器处理问题,可能都有所不同。因此不建议去根据平台、编译器处理方法进行判断,而是**变量在声明时,一律进行初始化**,避免出现这类问题。

http://www.jsqmd.com/news/978709/

相关文章:

  • EoM:用哈耶克的市场经济理论开发智能体,效果惊人
  • 都2026年了!想入行网络安全却不知道从哪开始?
  • 在Windows 11上用WSL2搭建OpenHarmony开发环境:从Ubuntu 20.04配置到RK3568编译一条龙
  • MATLAB实现月球着陆燃料最省轨迹规划:含动力学建模与非线性优化求解
  • Leetcode31 下一个排列
  • 告别连接失败:解决RT-Thread下LWIP的sockets与netconn差异问题
  • Spring AI 1.x 系列【43】基于标准输入输出 (STDIO) 与服务端推送事件 (SSE) 的 MCP 服务端
  • 从一次信息泄露事件说起:我是如何用Have I Been Pwned和Reg007保护自己账号的
  • COMSOL仿真避坑指南:搞定自然对流,这些边界条件和求解器设置千万别踩雷
  • ESP32-S2驱动EC11编码器,我踩过的三个坑和最终解决方案(附完整代码)
  • 高光谱图像修复技术:HSI-VAR架构与实战应用
  • Redis分布式锁进阶第三十二篇
  • 告别手动标注!用飞桨EasyDL的‘魔术笔’10分钟搞定4000张语义分割图
  • STM32课程设计避坑指南:从篮球记分器项目看红外遥控与定时器的实战应用
  • STM32F103R6频率计实战工程:Keil编译+Proteus仿真一键运行
  • 保姆级教程:手把手教你搞定华为USG6000V防火墙的跨版本升级(含固件下载与密码重置)
  • 手机App控制51单片机LED?一个HC-06蓝牙模块+串口中断就能搞定(附完整代码)
  • Proteus 8.6 仿真超声波测距,我踩过的坑和调试技巧(附完整工程)
  • GD32F405RGT6 SPI主从模式实战:手把手教你用逻辑分析仪调试时序(附完整工程)
  • 别再让STL模型在CoppeliaSim里‘飘’着了:手把手教你从Mesh到动力学仿真的完整流程
  • 从一次“信息泄露自查”说起:手把手教你用Have I Been Pwned和Reg007保护账号安全
  • 2026年靠谱的镀锌桥架/防火桥架用户口碑推荐厂家 - 行业平台推荐
  • 别再手动改Excel了!用Python的openpyxl批量处理单元格(合并、删除、移动)
  • 金水区郑大北校区购机实测:这3个黑曼巴定制款,竟能避开学区店80%的坑
  • Multisim仿真差动放大电路:从单端/双端输入到共模抑制比,一次搞懂所有测量(附实验数据对比)
  • 别再只跑 nvcc -V 了!CUDA 安装后必做的 5 项深度测试(含 Samples 编译、Pytorch GPU 验证)
  • 每一个你习以为常的 PHP 特性背后,都站着一个伟大的 CS 原理。
  • 从快时钟到慢时钟,脉冲信号CDC漏采怎么办?一个握手机制实例讲透
  • ZLToolKit线程模块源码拆解:从信号量到工作线程池,一个C++网络库的并发设计实战
  • ▲基于OFDM+QPSK的通信链路matlab性能仿真,包含LDPC,Schmidl-Cox频偏估计和MMSE信道估计