C语言中变量存放位置分析

  在嵌入式C语言中,需要清晰的知道我们定义的变量都存放在哪些位置。

  在C语言中变量可以存放在3个地方:普通内存,运行时的堆栈,CPU内部的通用寄存器

  其中,堆栈当然也是内存,不过相对于普通的内存,堆栈往往是用来暂存数据的,其内容变化非常频繁,所以我们在这里将普通内存与寄存器并列,并且将堆栈分离出来分析。在这3个地方存储的变量具有不同的特性。

  变量的存储类型首先取决于它的声明位置凡是在函数外声明的变量都是全局变量,在默认情况下,全局变量的作用域仅限于声明该变量的C文件中,如果希望在该C文件之外能够访问这个变量,程序员就要在引用该变量的C文件中使用extern关键字对这个变量进行重新声明,或者在定义该变量的.h文件中使用关键字extern重新声明。编译器在编译过程中将全局变量映射在普通内存中,在程序的整个执行过程中,该变量始终占用编译器为它分配的内存空间,它始终保持原来的值,直到对这个变量进行赋值操作或者是程序结束。所以我们也称全局变量为全局静态变量。对于ARM编译器而言,在编译的过程中编译器会生成2个全局变量的“段”:有初值全局变量RW(Read and Write)段和无初值全局变量ZI(Zero Initialized)段,链接器则将所有C文件的RW段和ZI段进行拼接并对其中的全局变量进行重新定位。另外,程序员不能修改全局变量的存储类型,它是静态的。

### C语言全局变量存储位置 在C语言中,全局变量无论是在文件作用域声明还是作为`static`类型的函数内声明,都会被放置在全球(静态)区内[^3]。此区域用于存放程序运行期间始终存在的数据对象。 当提到具有外部链接性的全局变量时——即那些在其首次声明处不带`static`修饰符而拥有文件范围可见度者,则这些实体会被安排到所谓的“已初始化的数据段”,如果它们已经被赋予初始值的话;反之则位于“未初始化的数据段(BSS)”之中[^1]。 对于带有`static`限定词的全局变量而言,尽管其作用范围受限于当前源码文件之内,但仍然遵循上述相同的内存安置原则[^5]。 下面通过一段简单的代码展示如何查看不同类型变量所在的地址: ```c #include <stdio.h> int global_var = 20; // 已初始化的全局变量 static int file_static = 30; // 文件内的静态全局变量 void show_addresses() { printf("Global variable address: %p\n", (void*)&global_var); printf("File static variable address: %p\n", (void*)&file_static); } int main(){ show_addresses(); return 0; } ``` 该例子展示了两个不同种类的全局/静态变量及其对应的内存地址输出方式。值得注意的是,实际物理地址可能因操作系统和编译环境的不同有所差异,但是逻辑上都处于全球(静态)区中。 #### 关键特性总结 - **持久性**:一旦创建直到程序终止才销毁; - **初始化状态**:根据是否有显式的初值决定放入不同的子区间; - **访问权限控制**:可通过`extern`关键字共享给其他翻译单元或利用`static`限制在同一文件内部使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值