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)) 。很快就溢出了。
版权声明:本文为qq_44989173原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。