全局变量、常量、程序代码、静态变量的位置关系

本文详细解析了C/C++中的内存管理及存储区划分,包括栈、堆、自由存储区、全局/静态存储区和常量存储区的特点与区别。深入探讨了每个存储区的作用、分配方式及生命周期。
一.在c中分为这几个存储区
1.栈   -   有编译器自动分配释放
2.堆   -   一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的> 另一块区域。-   程序结束释放
4.另外还有一个专门放常量的地方。   -   程序结束释放
二.在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。
1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程> 序结束后,操作系统会自动回收。
3.自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改)
所以静态变量和全局变量放在全局/静态存储区,而常量存放在常量存储区,程序代码当然放在代码区了~~ 

====

http://topic.youkuaiyun.com/t/20051001/15/4305188.html


--------------------------------------------------------------------------

BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。

数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。

代码段:代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读, 某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

堆(heap):堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)

栈(stack):栈又称堆栈, 是用户存放程序临时创建的局部变量,也就是说我们函数括弧“{}”中定义的变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。

====

http://hi.baidu.com/nkd2002/blog/item/4e91a46d8e7e06fe4216946f.html

<think>好的,我现在要介绍一下全局变量静态变量常量。首先,我需要理清每个概念的基本定义,然后比较它们的区别和联系。可能还需要考虑它们的作用域、生命周期、内存分配以及使用场景。 全局变量应该是在所有函数外部定义的变量,作用域是整个程序,可以在任何地方访问。生命周期是从程序开始到结束。但要注意不同文件中的全局变量可能需要extern来声明。 静态变量的话,分为静态局部变量和静态全局变量静态局部变量在函数内部定义,作用域还是函数内,但生命周期延长到整个程序运行期间,只初始化一次。静态全局变量是在文件内定义的,作用域限制在定义它的文件内,其他文件无法访问,这样可以避免命名冲突。 常量的话,分为字面常量和const修饰的常量。const常量在C中可能和C++中的处理不同,比如在C中可能还是可以通过指针修改,而C++中更严格。另外,常量通常存储在只读区域,比如文本段,不可修改。 需要比较它们的存储位置全局变量静态变量可能在数据段,未初始化的在BSS段,初始化的在数据段。常量可能在代码段或只读数据段。还要注意初始化的不同,比如静态变量如果没有显式初始化会被初始化为0,而局部变量不初始化是随机值。 使用场景方面,全局变量用于多个函数共享数据,但要注意避免滥用导致耦合度高。静态变量用于保持函数调用间的状态,或者限制作用域。常量用于不变的值,提高可读性和安全性。 可能需要注意不同编程语言中的差异,比如C和C++中const的行为。另外,静态成员变量在类中的使用可能需要提到,但用户的问题可能更偏向于C语言的基础概念。 需要确保术语准确,比如作用域、生命周期、链接属性这些关键词。可能还需要举例子说明,比如静态局部变量在函数中的计数应用,静态全局变量在文件内的隐藏,全局变量在程序范围内的共享等。 还要注意语法,比如在C中静态变量的声明方式,使用static关键字,常量的定义方式。可能提到头文件中常量的定义通常用#define或const,但要注意链接问题。 总结时,分点对比它们的作用域、生命周期、内存位置、初始化和使用场景,确保用户能清晰区分这三个概念。</think>全局变量静态变量常量是编程中的重要概念,以下是它们的详细介绍和对比: --- ### **1. 全局变量** #### **定义** 在函数外部定义的变量,作用域为**整个程序**,所有文件或模块均可访问(需通过 `extern` 声明跨文件访问)。 #### **特点** - **作用域**:全局可见(需注意跨文件访问规则)。 - **生命周期**:程序启动时分配内存,程序结束时释放。 - **存储位置**:已初始化的在**数据段**,未初始化的在**BSS段**。 - **初始化**:未显式初始化时,默认初始化为 `0` 或 `NULL`。 - **使用场景**:多个函数或文件需要共享数据时,但需谨慎使用以避免耦合。 #### **示例** ```c int globalVar = 10; // 全局变量 void func() { extern int globalVar; // 跨文件访问需声明 printf("%d", globalVar); } ``` --- ### **2. 静态变量** #### **定义** 使用 `static` 关键字修饰的变量,分为两种: - **静态局部变量**:函数内部定义,作用域限于函数内,但生命周期延长至整个程序运行。 - **静态全局变量**:文件内部定义,作用域限于当前文件(避免命名冲突)。 #### **特点** - **作用域**: - 静态局部变量:仅在函数内可见。 - 静态全局变量:仅在当前文件内可见。 - **生命周期**:程序运行期间始终存在。 - **存储位置**:与全局变量相同(数据段/BSS段)。 - **初始化**:未显式初始化时,默认初始化为 `0`。 - **使用场景**: - 静态局部变量:保留函数调用间的状态(如计数器)。 - 静态全局变量:隐藏文件内部的变量,避免外部访问。 #### **示例** ```c void counter() { static int count = 0; // 静态局部变量 count++; printf("%d", count); } static int hiddenVar; // 静态全局变量(仅当前文件可见) ``` --- ### **3. 常量** #### **定义** 值不可修改的变量,通常通过 `const` 关键字或宏定义(`#define`)实现。 #### **特点** - **作用域**:取决于定义位置(类似普通变量或宏)。 - **生命周期**:与作用域一致。 - **存储位置**: - `const` 变量:通常存储在**只读数据段**(如 `.rodata`)。 - 宏:预处理阶段替换,不占用内存。 - **初始化**:必须显式初始化,且不可修改。 - **使用场景**:定义固定值(如数学常数、配置参数)。 #### **示例** ```c const float PI = 3.14159; // const常量 #define MAX_SIZE 100 // 宏常量 // C++中更严格的常量定义 constexpr int SIZE = 100; // C++11引入的编译期常量 ``` --- ### **对比总结** | 特性 | 全局变量 | 静态变量 | 常量 | |---------------|-------------------------|-------------------------|-----------------------| | **作用域** | 整个程序(跨文件需声明)| 文件或函数内 | 取决于定义方式 | | **生命周期** | 程序运行期间 | 程序运行期间 | 与作用域一致 | | **存储位置** | 数据段/BSS段 | 数据段/BSS段 | 只读数据段(如.rodata)| | **可修改性** | 可修改 | 可修改(静态局部变量) | 不可修改 | | **典型用途** | 跨函数/文件共享数据 | 保留状态或隐藏变量 | 定义固定值 | --- ### **注意事项** 1. **全局变量**:滥用可能导致代码耦合,建议优先使用参数传递或封装。 2. **静态变量**:多线程环境中需注意线程安全性。 3. **常量**: - C中 `const` 变量可能仍可通过指针修改(非严格常量)。 - C++中 `constexpr` 提供真正的编译期常量
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值