因此,尽管标准没有讨论堆栈,但大多数现代实现都会将自动变量放在堆栈上,并且堆栈通常会在堆栈之间1M
,8M
并且您会因数组大小而溢出。您可以在此处找到不同系统的典型堆栈大小:
SunOS/Solaris 8172K bytes
Linux 8172K bytes
Windows 1024K bytes
cygwin 2048K bytes
第一个没有段错误的原因是因为编译器实际上不必引用任何内存,但是如果您需要引起一些副作用,那么编译器会生成一个内存访问,这将导致实际的堆栈溢出。既然您说您正在使用gcc
如果我运行此代码而没有任何副作用(现场示例),它确实会调整堆栈指针但从不使用它:
subq $23952048, %rsp
std::cin
但是如果我们通过and std::cout
(现场示例)添加副作用:
std::cin >> tabs[maxsize-1][5] ;
std::cout << tabs[maxsize-1][5] << std::endl ;
那么它将需要使用堆栈指针:
leaq 3(%rsp), %rbx
这通常会在类 Unix 系统上产生段错误。
请注意,您可能还会注意到此警告:
warning: ISO C++ forbids variable length array ‘tabs’ [-Wvla]
这是因为可变长度数组不是标准C++(但在C99中有效)是gcc 扩展,并且在使用扩展时-pedantic
会发出警告。