大数组不会导致堆栈溢出

时间:2016-02-08 16:47:02

标签: c clang stack-overflow

我可以找到很多开发人员抱怨在堆栈上初始化的大数组会产生stack overflow错误的例子

int main(int argc, const char * argv[])
{
    int v[100000000];
    memset(&v, 0, sizeof(v));
}

在Apple LLVM 7.0上进行编译时,这不会导致stack overflow,这让我感到困惑,因为数组的大小约为400Mb,远远超过通常的堆栈大小。

为什么上述代码不会导致stack overflow

2 个答案:

答案 0 :(得分:2)

由于您没有使用v,因此编译器可能没有分配它,尝试类似

的内容
int v[100000000];
for (int i = 0 ; i < sizeof(v) / sizeof(*v) ; ++i)
    v[i] = 0;

答案 1 :(得分:0)

您的数组超过100 Mb(*),但假设它是100 Mb,这意味着您的堆栈大小大于100 Mb,或者您的编译器忽略它,因为您不使用它。这是编译器优化。

(*)确实1M = 1024 * 1024,而不是1000 * 1000.一个int超过1位,也超过1个字节。最后,Mb表示Megabit,MB表示Megabyte。