c max数组大小受printf影响

时间:2017-02-12 06:53:10

标签: c segmentation-fault printf

我想知道为什么其中一些程序会抛出一个段错误,而其他程序却没有。

这个程序引发了一个段错误:

#include <stdio.h>

int main(){
    int ar[2096263];
    printf("asdf");
}

这个没有:

#include <stdio.h>

int main(){
    int ar[2096263];
}

这个程序没有:

#include <stdio.h>

int main(){
    int ar[2096262];
    printf("asdf");
}

这个确实:

#include <stdio.h>

int main(){
    int ar[2096262];
    printf("asdf");
    printf("asdf");
    printf("asdf");
    printf("asdf");
    printf("asdf");
}

这个人没有:

#include <stdio.h>

int main(){
    int ar[2096262];
    printf("asdf");
    printf("asdf");
    printf("asdf");
    printf("asdf");
}

我不明白为什么调用printf会改变我在main中可以拥有的数组大小的限制。另外,为什么我的数组不能超过2096262个?

由于

2 个答案:

答案 0 :(得分:4)

由于实现原因,局部变量(包括数组)存储在堆栈中。函数调用也会添加到堆栈中,既包含一些元信息,也包含被调用函数的局部变量。这一切都加起来。

现在,堆栈是一种有限的资源,例如在Windows上,默认的进程堆栈大小只有一个MB。

在Linux上(我假设您使用,因为您提及&#34;分段错误&#34;)默认堆栈大小为8MB,堆栈上有两百万个四字节整数(sizeof(int)通常4)您达到了该限制并且堆栈溢出

答案 1 :(得分:1)

您已在本地申报。存储器的堆栈部分中的本地数组存储和堆栈的大小是有限的。因此,当您给出大于堆栈的大小时,您会得到分段错误。它也被称为堆栈溢出问题。

要拥有更大的数组,您需要将其声明为静态变量或文件范围。

 static int ar[2096263]; // This works fine.