在C++中,变量的存储位置取决于它们的类型和生命周期。那么不同的各个变量究竟存储在哪个区域呢?
1.不同类型的变量
我们首先从变量类型的不同来说明:
1. 全局变量和静态变量
- 存储区:全局/静态区(静态区)
- 说明:全局变量(包括文件级和函数级的)和使用 `static` 关键字声明的变量存储在静态区中。它们在程序启动时被分配,并在程序结束时销毁,具有整个程序的生命周期。
int globalVar; // 全局变量
int main()
{
static int staticVar; // 静态变量
return 0;
}
2. 局部变量
- 存储区:栈区(Stack)
- 说明:局部变量是在函数或代码块内部声明的变量。它们在函数执行时分配,在函数退出后销毁。栈区的分配和释放速度很快,但栈区的大小有限。
void func() {
int localVar; // 局部变量
}
3. 动态分配的变量
- 存储区:堆区(Heap)
- 说明:通过 new、malloc等动态分配的变量存储在堆区中。堆区的内存由程序员手动管理,使用 new分配后需要手动 delete,malloc分配后需要 free释放,否则可能会导致内存泄漏。
int* p = new int; // 动态分配的变量
delete p;
指针变量p作为局部变量存储在栈区
,p通过new分配的内存空间在堆区
4. 常量
- 存储区:常量存储区(常量区)
- 说明:字符串常量和const修饰的全局变量等通常存储在常量区。这个区域是只读的,无法修改。
const int constVar = 100; // 常量
constVar是一个const修饰的局部变量,存储在栈区,100存储在
程序的只读数据段(常量区)
const char* str = "Hello"; // 字符串常量
str是一个局部变量,存储在栈区,它保存的是字符串常量“hello”
的地址,“hello”存储在产量区(也称只读数据区),因为他是不
可修改的字符串的字面值
5. 函数参数
- 存储区:栈区(Stack)
- 说明:函数参数在函数调用时压入栈中,当函数返回时这些参数被销毁。
6. 静态局部变量
- 存储区:全局/静态存储区(静态区)
- 说明:静态局部变量只在函数中初始化一次,并在整个程序运行期间保留它的值,但它的作用域仍然在定义它的函数中。
void func() {
static int staticLocalVar = 0; // 静态局部变量
}
2.内存分配区域
我们再从内存分配的5个主要区域来说明:
1. 栈区(Stack Segment):局部变量、函数参数、返回地址。
2. 堆区(Heap Segment):动态分配的内存。
3. 全局/静态存储区(Data Segment):
- 已初始化数据段:已初始化的全局变量和静态变量。
- 未初始化数据段:未初始化的全局变量和静态变量。
4. 常量区(Text/ROData Segment):字符串常量、`const` 修饰的全局常量。
5. 代码区(Code Segment or Text Segment):存储程序的可执行代码。
接下来我们来详细介绍这五块区域:
1. 栈区(Stack Segment)
- 特点:用于存储局部变量、函数参数和返回地址。栈上的内存分配是自动管理的,即由编译器在函数调用时自动分配并在函数返回时自动释放。
- 分配方式:由系统自动分配和释放,遵循后进先出(LIFO)的原则。
- 优点&