C语言-栈

本文最后更新于:1 年前

基础

  • 栈是一段连续的内存,需要同时记录栈底和栈顶,才能对当前的栈进行定位。在现代计算机中,通常使用ebp寄存器指向栈底,而使用esp寄存器指向栈顶

    ebp: Extend Base Pointer
    esp: Extend Stack Pointer

  • 一个程序可以包含多个线程,每个线程都有自己的栈,栈能使用的内存在编译时决定。所以栈内存大小与编译器有关。

    在 VC/VS 下,默认是 1M,

    在 C-Free 下,默认是 2M,

    在 Linux GCC 下,默认是 8M

  • 如果程序使用的栈内存超出最大值,就会发生栈溢出(Stack Overflow)错误。

栈变量大对象传递时的 双向拷贝 现象

调用函数时会先开辟空间,存放临时对象,然后把此临时空间的地址放入eax供被调用者(函数)返回。返回之后,调用者又会将临时空间的内容拷贝到变量中。故大对象传递时应使用指针。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct big_thing {
char buf[128];
}big_thing;

big_thing return_test() {
big_thing b;
b.buf[0] = 0;
return b;
}

int main() {
big_thing n = return_test();
return 0;
}