程序代码,常量,局部变量,全局变量,在内存中的储存位置

本文详细介绍了C/C++程序的内存分配机制,包括栈区、堆区、全局区、文字常量区及程序代码区的功能与作用。并通过具体示例程序解释了不同变量类型的存储位置。
 

全局变量、静态局部变量保存在全局数据区,初始化的和未初始化的分别保存在一起;

普通局部变量保存在堆栈中;

全局变量和局部变量在内存里的区别? 

一、预备知识—程序的内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区—存放函数体的二进制代码。



二、例子程序

这是一个前辈写的,非常详细

//main.cpp

int a = 0; 全局初始化区

char *p1; 全局未初始化区

main()

{

int b;// 栈

char s[] = "abc"; //栈

char *p2; //栈

char *p3 = "123456"; 123456\0";//在常量区,p3在栈上。

static int c =0; //全局(静态)初始化区

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

//分配得来得10和20字节的区域就在堆区。

strcpy(p1, "123456"); //123456\0放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。

}

 

 

<think> 根据用户问题,需要解释变量、常量全局变量局部变量的生命周期和内存占用情况。结合引用内容,我们分别解释: 1. **全局变量**: - **生命周期**:从程序启动到程序结束(整个程序运行期间)[^1][^2]。 - **内存占用**:存储在全局/静态存储区(包括静态全局变量)[^1][^4]。该区域在程序启动时分配,程序结束时释放。 - **特点**:全局变量在整个程序中可见(但注意静态全局变量只在本文件内可见)[^4]。 2. **局部变量**: - **生命周期**:从进入定义它的函数或代码块开始,到离开该函数或代码块时结束[^2][^3]。 - **内存占用**:通常存储在栈上(除非用`static`修饰),内存由系统自动分配和释放。 - **特点**:局部变量只在定义它的函数或代码块内可见[^3]。 3. **常量**: - **生命周期**:取决于其定义位置: - 如果是全局常量(在函数外定义),生命周期同全局变量。 - 如果是局部常量(在函数内定义),生命周期同局部变量。 - **内存占用**: - 全局常量:通常存储在只读存储区(如.rodata段)或全局/静态存储区。 - 局部常量:通常存储在栈上(但值不可变)。 - **特点**:常量一旦初始化后不可修改。 4. **静态变量**(补充,因引用中多次提到): - **静态局部变量**:在函数内用`static`定义。 - 生命周期:整个程序运行期间(第一次进入函数时初始化,之后每次调用保持上次的值)[^4]。 - 内存占用:全局/静态存储区。 - **静态全局变量**:在文件内用`static`定义。 - 生命周期:整个程序运行期间。 - 内存占用:全局/静态存储区,但作用域仅限于定义它的文件[^4]。 **内存占用总结**: - **栈**:局部变量(非常量、非静态)、局部常量。 - **堆**:动态分配的内存(如`malloc`/`new`)。 - **全局/静态存储区**:全局变量、静态全局变量、静态局部变量、全局常量(如果未放入只读段)。 - **只读存储区**:常量字符串、全局常量(可能放于此)。 **注意**:具体内存区域可能因编译器和系统而异,但上述是通用情况。 §§相关问题§§ 1. 全局变量和静态局部变量在生命周期上有何异同? 2. 常量存储在只读存储区有什么好处? 3. 如何避免局部变量占用过多栈内存? 4. 静态全局变量和普通全局变量有什么区别? </think>### 变量、常量全局变量局部变量的生命周期和内存占用 #### 1. **变量分类与生命周期** | 类型 | 生命周期 | 内存区域 | |---------------|--------------------------------------------------------------------------|------------------| | **全局变量** | 从程序启动到程序结束(整个程序运行期间)[^1][^4] | 全局/静态存储区 | | **局部变量** | 从进入定义它的代码块开始,到离开该代码块结束(如函数执行完毕)[^2][^3] | 栈内存 | | **静态局部变量**| 首次调用时初始化,程序结束时销毁(持久在)[^4] | 全局/静态存储区 | | **常量** | 取决于定义位置:<br>- 全局常量:同全局变量<br>- 局部常量:同局部变量 | 常量区或栈内存 | #### 2. **内存占用详解** - **全局/静态存储区**: - 全局变量、静态变量(包括`static`修饰的局部变量)[^1][^4] - 特点:编译时分配固定内存,生命周期与程序一致 - 示例:`int globalVar; // 全局变量` - **栈内存**: - 局部变量(含局部常量)[^2][^3] - 特点:自动分配/释放,随函数调用动态变化 - 示例: ```c void func() { int localVar; // 局部变量 const int k = 5; // 局部常量 } ``` - **常量区**: - 放字面常量(如字符串常量) - 特点:只读内存,程序结束时释放 - 示例:`const char* s = "Hello";` #### 3. **关键差异对比** | 特性 | 全局变量 | 局部变量 | 常量 | |---------------|---------------|---------------|---------------| | **作用域** | 全局可见[^1] | 代码块内[^3] | 同变量类型 | | **修改性** | 可修改 | 可修改 | **不可修改** | | **内存开销** | 固定占用 | 动态释放 | 同变量类型 | | **访问速度** | 慢(需寻址) | 快(栈直接访问)| 同变量类型 | #### 4. **使用场景与风险** - **全局变量**:适合共享数据,但易导致耦合(多文件需用`extern`声明)[^4] - **局部变量**:推荐优先使用,避免内存泄漏风险 - **常量**:提高安全性和可读性,尤其是配置参数 - **内存警告**: - 栈溢出:局部变量过大(如大数组)导致栈崩溃[^3] - 全局区膨胀:过多全局变量增加内存占用 > 示例代码:局部变量的生命周期 > ```c > #include <stdio.h> > int main() { > { > int a = 10; // 局部变量a在此代码块内有效 > printf("%d\n", a); // 正确 > } > printf("%d\n", a); // 错误!a已销毁[^3] > } > ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值