讲师博文
C语言-变量存储方式 来源 : 华清远见     2025-01-16

程序段的内存布局

在C程序中,内存通常分为几个主要区域:

1. 代码段(.text段) - 存放程序的指令。

2. 数据段(.data段) - 存放已初始化的全局和静态变量。

3. BSS段(.bss段) - 存放未初始化的全局和静态变量。

4. 堆区 - 动态分配内存(例如通过malloc)。

5. 栈区 - 存放局部变量和函数参数

1. 局部变量

定义:局部变量是在函数或代码块内部声明的变量。

存在位置:

· 栈区(Stack):局部变量存储在程序的栈区。当一个函数被调用时,栈区会为该函数的局部变量分配内存。当函数执行结束后,这部分内存会被自动释放。

特点:

· 作用域:局部变量只能在其声明的函数或代码块内使用。外部无法访问。

· 生命周期:局部变量的生命周期从定义时开始,到函数结束时结束。

测试程序概念图:

2. 全局变量

定义:全局变量是在所有函数外部声明的变量,可以被程序中任何函数访问。

存在位置:

· 数据区(Data Segment):全局变量存储在程序的静态数据区(也称为数据段)。这个区域在程序启动时分配内存,并在整个程序运行期间保持有效。

特点:

· 作用域:全局变量可以在任何函数内访问,任何地方都可以使用。

· 生命周期:全局变量的生命周期与整个程序的运行时间相同,直到程序结束。

测试程序概念图:

3. 动态申请的数据

定义:动态申请的数据是指在程序运行时,根据需要动态分配内存的一种变量,通常通过如 malloc、calloc 或 new 等函数申请。

存在位置:

· 堆区(Heap):动态申请的数据存储在堆区。堆区的内存分配和释放由程序员手动管理。

特点:

· 作用域:动态分配的内存可以在多个函数之间共享,直到显式释放。

· 生命周期:生命周期由程序员控制,内存不再需要时需要手动释放(使用 free 或 delete)以避免内存泄漏。

测试程序概念图:

代码测试:


结果:

查看内存映射:

内存映射解释:

第一行 555ce2a81000-555ce2a82000 r-xp:

这个段通常是 .text 段,表示程序的代码部分。

权限 r-xp 表明它可读且可执行,这符合代码段的特性。

第二行 555ce2c81000-555ce2c82000 r--p:

这里的权限为 r--p,表明这个段是可读的,不可执行,只读段 

第三行 555ce2c82000-555ce2c83000 rw-p: 

权限 rw-p 表示可读可写,因此这个段通常是 .bss段,用于存放未初始化的全局和静态变量,或者是.data 段,用来存放 已初始化的全局和静态变量。 

第四行555ce460d000-555ce462e000 rw-p:

权限rw-p 表示可读可写,这块有说明是heap堆区,由程序员进行分配回收

第十五行 7ffd6b3a6000-7ffd6b3c7000 rw-p:

权限rw-p 表示可读可写,这块有说明是栈区

 总结

由测试代码可知虽然topo在func函数结束后在main程序还能打印,那是因为虽然释放topo空间,但是这块空间并没有被占用,所以程序并没有出错。

所以我们根据测试记录可得出以下结论。

这些变量的存储位置和管理方式是理解计算机程序运行机制的基础:

· 局部变量在栈中,具有局部作用域;

· 全局变量在数据区,具有全局作用域;

· 动态申请的数据在堆中,生命周期灵活,但需要手动管理

扫码申领本地嵌入式教学实录全套视频及配套源码

上一篇:堆栈溢出的原因

下一篇:在深度学习中使用Dropout技术的动机和它如何防止过拟合

400-611-6270

Copyright © 2004-2024 华清远见教育科技集团 版权所有
京ICP备16055225号-5京公海网安备11010802025203号