C 最大数组大小受 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 个整数?

谢谢

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

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

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

您已在本地声明。本地数组存储在堆栈部分的内存和堆栈大小是 limited.so 的,当你给出的大小超过堆栈时,你会得到分段错误。这也称为堆栈溢出问题。

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

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

相关内容

  • 没有找到相关文章

最新更新