C语言变量或者常量的存储位置在哪?

1、code、RW、ZI、RO认识

     code:代码存储,在ROM中,掉电不丢失;

     RW:可读可写变量,既在ROM中,又在RAM中存储;

     ZI:初始化为0的变量,存储在RAM中;

    RO:只读,存储在ROM中。

2、RAM、ROM统计公式

     RAM = RW  +  ZI;

     ROM = code  +  RW  +  RO;

示意图如下:

在这里插入图片描述

3、内存五大分区

      堆区(Heap):运行时程序new分配的,也就是应用程序申请的,由应用程序自行申请和释放。

      栈区(Stack):运行时为保持信息临时申请的,结束后释放,例如函数的参数、内部申请的非静态变量等信息。

      自由存储区:由malloc申请,free释放,系统层面管理。

      全局和静态存储区:全局变量和静态变量分配的区域,是否初始化,分配会位置会不一样。

      常量存储区:存储常量,例如字符串、const修饰变量等等。

4、内存分区与存储区域对应关系

     代码段(CODE DATA):执行的机器码组成,存储在ROM。

     只读数据段(RO DATA):存储程序中不可更改的数据,常量存储区属于这里,存储在ROM。

     已初始化可读可写数据段(RW DATA):程序中已定义,并且进行初始化的数据,全局和静态存储区中已经初始化的数据在这里存储,既存储

在ROM,又存储在RAM。

     未初始化数据段(BSS):程序中已定义,并且未初始化的数据,全局和静态存储区中未初始化的数据在这里存储,存储在RAM内。

     堆和栈:程序运行时,从RAM中申请分配的。

    问题:const修饰的变量是如何存储的?

5、常见一些情况的存储剖析

<think>嗯,用户问的是C语言常量数据的存储空间安排,以及static全局变量和static局部变量存储空间安排。这个问题涉及到内存布局,我得仔细回忆一下相关知识,确保回答正确。 首先,C程序的存储区通常分为几个部分:代码段(text)、已初始化数据段(data)、未初始化数据段(bss)、栈(stack)和堆(heap)。常量数据应该存放在哪里呢?比如字符串常量或者const修饰的变量。记得字符串常量通常放在代码段或者只读数据段(rodata),而const变量可能根据情况不同,如果是全局的,可能在rodata,如果是局部的,可能在栈上,但实际可能还是取决于编译器实现。这里可能需要区分不同情况,避免误导用户。 然后是static全局变量和static局部变量。static全局变量的作用域是文件内部的,但存储位置应该是在数据段或bss段,取决于是否初始化。比如已初始化的放在data段,未初始化的放在bss段。而static局部变量虽然作用域是函数内,但生命周期是整个程序运行期间,所以它们应该也是在data或bss段,而不是栈里。这点需要确认,因为有些资料可能提到静态存储区,其实就是数据段和bss段。 用户可能想知道这些变量在内存中的具体位置,以及它们的生命周期和访问权限。比如static局部变量在函数多次调用中保持值,因为存储在静态区,而不是栈上。而static全局变量只能在定义它的文件内访问,但存储位置和普通全局变量类似。 需要注意的是,不同编译器和平台可能有差异,但标准的大致划分应该是这样的。另外,const变量是否真的只读,是否存储在rodata,可能要看具体实现,比如有的编译器会把const全局变量放在rodata,而局部const变量可能放在栈,但无法修改。 可能需要举例说明,比如字符串常量"hello"放在rodata,static int a在data,static int b未初始化在bss。同时,static局部变量和全局static变量存储位置类似,但作用域不同。 总结结构应该分两部分:先讲常量数据的存储安排,再讲static变量的两种情况的存储安排。确保用中文,行内公式用$,独立公式用$$。可能需要检查是否有错误,比如是否混淆了某些段的位置或者作用域和生命周期的描述是否正确。</think>C语言程序的内存布局分为以下几个部分,存储空间安排如下: #### 一、常量数据的存储空间安排 1. **代码段(.text)** 存储机器指令和**字符串常量**(如 $"Hello"$),该区域只读。 2. **只读数据段(.rodata)** 存储编译时确定的常量: - 全局`const`变量(如 $const\ int\ MAX = 100;$) - 数值常量(如 $3.14$) - 枚举值(如 $enum\ {A=1,\ B=2};$) 3. **栈(Stack)** 函数内部定义的`const`局部变量(如 $const\ char* p = "test";$)实际指向.rodata,但指针变量本身在栈中。 $$ \begin{aligned} \text{示例:} \\ &\text{全局常量}\rightarrow \text{.rodata} \\ &\text{字符串}\ "Hello"\rightarrow \text{.rodata} \\ &\text{局部}\ const\ \text{指针}\rightarrow \text{栈} \end{aligned} $$ --- #### 二、static变量存储空间安排 1. **static全局变量** - 存储区域:已初始化的在**.data段**,未初始化的在**.bss段** - 特点:仅在定义它的文件内可见,程序启动时分配空间,生命周期持续到程序结束 - 示例: ```c static int initialized = 10; // 存储于.data static int uninitialized; // 存储于.bss ``` 2. **static局部变量** - 存储区域:与static全局变量相同(**.data**或**.bss**) - 特点:仅在函数内可见,但生命周期与程序一致 - 示例: ```c void func() { static int count = 0; // 首次调用初始化,存储于.data static char buffer[100]; // 未初始化,存储于.bss } $$ --- #### 三、内存布局示意图 $$ \begin{array}{|c|c|} \hline \text{高地址} & \text{栈(Stack)} \\ & \downarrow \text{生长} \\ \hline & \text{堆(Heap)} \\ & \uparrow \text{生长} \\ \hline \text{未初始化数据(.bss)} & \text{static未初始化变量/全局未初始化变量} \\ \hline \text{已初始化数据(.data)} & \text{static初始化变量/全局初始化变量} \\ \hline \text{只读数据(.rodata)} & \text{字符串常量/全局const变量} \\ \hline \text{代码段(.text)} & \text{程序指令} \\ \hline \text{低地址} & \\ \end{array} $$ #### 四、关键差异总结 | 变量类型 | 存储区域 | 作用域 | 生命周期 | |--------------------|------------|----------------------|----------------| | static全局变量 | .data/.bss | 文件内 | 程序运行期间 | | static局部变量 | .data/.bss | 函数内 | 程序运行期间 | | 全局常量 | .rodata | 文件内/全局(取决声明)| 程序运行期间 | | 局部const指针 | 栈 | 函数内 | 函数执行期间 |
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值