由编译器自动分配释放,存放函数的参数值、局部变量等
由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
存放全局变量和静态变量,程序结束后由系统释放
存放常量字符串,程序结束后由系统释放
存放函数体的二进制代码
// 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); // 堆区
strcpy(p1, "123456"); // "123456\0"放在常量区
}
void __stdcall func(int param1, int param2, int param3) {
int var1 = param1; // 栈
int var2 = param2; // 栈
int var3 = param3; // 栈
// ...
}
int main() {
func(1, 2, 3); // 参数从右向左压栈: 3, 2, 1
return 0;
}
内存地址 | 内容 | 说明 |
---|---|---|
0x0012ff78 | param1 (1) | 第一个参数 |
0x0012ff7c | param2 (2) | 第二个参数 |
0x0012ff80 | param3 (3) | 第三个参数 |
0x0012ff68 | var1 | 局部变量1 |
0x0012ff6c | var2 | 局部变量2 |
0x0012ff70 | var3 | 局部变量3 |
就像去饭馆吃饭:
优点:快捷
缺点:自由度小
就像自己做饭:
优点:符合自己口味,自由度大
缺点:比较麻烦
本文来源:关于堆栈的讲解(我见过的最经典的)