C/C++之函数的栈空间
上节我们介绍了函数的许多内容。C/C++之自定函数(内容长)
本节我们介绍函数的栈空间。
-
使用一个错误的程序进行测试:
#include <iostream> using namespace std; void test(){ //运行时会因为栈帧空间溢出而崩溃 char buff[2000000]; //2M大小 cout << (int)buff[sizeof(buff) - 1] << endl; } int main(){ test(); return 0; }
点调试,发现程序直接崩溃!输出错误信息:Stack overflow(栈空间溢出)
-
函数栈空间:(此处对内存有更加详细的介绍。)
要避免栈空间溢出!
当调用一个函数时,就会在栈空间为这个函数分配一块内存空间。
这块空间专门给函数使用,称为 “栈帧” -
内存:(了解即可)
栈空间中存放了变量,以及函数。
-
上面的错误程序可以理解为:
test()的大小超出了栈空间,导致程序崩溃。
-
另一种情况:(采用递归函数,自己调用自己)
#include <iostream> using namespace std; //编译器提示(警告)C6262:函数使用了堆栈的"100004"个字节:超过了/analyze:stacksize '16384'。请考虑将某些数据移到堆中。 void test(int n) { //运行时会因为栈帧空间溢出而崩溃 char buff[1000 * 100]; //100k大小 cout << "n = " << n << endl; cout << "buff: " << (int)&buff << endl; // 打印地址 if (n) { test(n - 1); } } int main() { test(5); return 0; }
输出结果:
n = 5 buff: 14119908 n = 4 buff: 14018336 n = 3 buff: 13916764 n = 2 buff: 13815192 n = 1 buff: 13713620 n = 0 buff: 13612048
-
观察buff每次的地址,每次都相差101,572字节,感觉除了警告外没别的异常。
现在加大test()的参数,(test(10)) 。很快就溢出了。