1

我有以下非常简单的代码,可以完美运行:

void func(int *tab)
{
    return;
}

int main()
{
    int maxsize = 999*999;
    int tabs[maxsize][6];

    return 0;
}

但是,当我修改 main 以便获得它时,它会崩溃。

int main()
{
    int maxsize = 999*999;
    int tabs[maxsize][6];

    func(tabs[0]);

    return 0;
}

你知道为什么吗?非常感谢您对此的帮助,谢谢^^

4

1 回答 1

2

因此,尽管标准没有讨论堆栈,但大多数现代实现都会将自动变量放在堆栈上,并且堆栈通常会在堆栈之间1M8M并且您会因数组大小而溢出。您可以在此处找到不同系统的典型堆栈大小:

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会发出警告。

于 2013-11-07T21:00:55.393 回答