文章目录
- 前言
- 1. 栈(Stack)
- 特点
- 生命周期
- 示例
- 2. 堆(Heap)
- 特点
- 生命周期
- 示例
- 3. 静态区(Static/Global 区)
- a. 已初始化数据段(.data 段)
- 特点
- 生命周期
- 示例
- b. 未初始化数据段(.bss 段)
- 特点
- 示例
- 4. 文字常量区(常量区)
- 特点
- 生命周期
- 示例
- 5. 代码区(Text Segment)
- 特点
- 示例
- 6. 线程局部存储(Thread-Local Storage, TLS)
- 特点
- 示例
- 7.综合示例代码
- 8.关键区别总结
- 总结
前言
在 C/C++ 中,变量的存储位置直接影响其生命周期、作用域和访问方式。以下是主要存储区域及其示例代码:
1. 栈(Stack)
特点
特点:自动分配/释放,函数局部变量、参数等,速度快但空间有限(通常几MB)
生命周期
生命周期:函数调用开始到结束
示例
void foo() {int a = 10; // 栈上分配char buffer[1024]; // 栈上数组
}
2. 堆(Heap)
特点
特点:手动分配/释放(malloc/free 或 new/delete),空间大但需管理
生命周期
生命周期:从分配直到显式释放
示例
// C 风格
int *p1 = (int*)malloc(sizeof(int)); // 堆分配
free(p1);
// C++ 风格
int *p2 = new int; // 堆分配
delete p2;
3. 静态区(Static/Global 区)
a. 已初始化数据段(.data 段)
特点
特点:显式初始化的全局变量、静态变量
生命周期
生命周期:程序启动到结束
示例
int global_var = 42; // 全局变量,.data 段void func() {static int static_local = 10; // 静态局部变量,.data 段
}
b. 未初始化数据段(.bss 段)
特点
特点:未显式初始化的全局变量、静态变量(默认初始化为0)
示例
int global_uninit; // .bss 段(初始化为0)void func() {static int static_uninit; // .bss 段(初始化为0)
}
4. 文字常量区(常量区)
特点
特点:存放字符串常量和 const 常量(只读)
生命周期
生命周期:程序启动到结束
示例
const char* str = "Hello"; // "Hello" 在常量区,str 自身可能在栈或静态区
const int MAX = 100; // 可能被编译器优化到常量区或直接内联
5. 代码区(Text Segment)
特点
特点:存放程序的可执行指令(如函数体代码)
示例
void some_function() { // 函数体的**机器码**存放在代码区// ...
}
6. 线程局部存储(Thread-Local Storage, TLS)
特点
特点:每个线程独立的变量(C11/C++11 起支持 _Thread_local 或 thread_local)
示例
#include <threads.h>
_Thread_local int tls_var; // 每个线程独立实例
7.综合示例代码
#include <stdlib.h>
#include <stdio.h>// 静态区(.data 段)
int global_initialized = 10;// 静态区(.bss 段)
int global_uninitialized;void func() {// 栈变量int local_stack = 20;// 静态局部变量(.data 或 .bss 段)static int static_local = 30;// 堆分配int* heap_var = (int*)malloc(sizeof(int));*heap_var = 40;free(heap_var);
}int main() {// 栈变量int a = 50;// 堆分配int* b = (int*)malloc(sizeof(int));*b = 60;func();// 常量区const char* str = "Constant String";free(b);return 0;
}
8.关键区别总结
存储区 分配方式 生命周期 典型用途
栈 自动 函数调用期间 局部变量、参数
堆 手动(new/malloc) 显式释放前 动态数据结构
静态区 编译器 程序运行期间 全局变量、静态变量
文字常量区 编译器 程序运行期间 字符串常量、const
代码区 编译器 程序运行期间 可执行指令
理解这些区域有助于避免内存泄漏、悬垂指针等问题,并优化程序性能。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了C/C++中的不同变量存储位置下的变量的分配方式、生命周期、典型用途。