c 受 printf 影响的最大数组大小

标签 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 个?

谢谢

最佳答案

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

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

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

关于c 受 printf 影响的最大数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42184970/

相关文章:

java - 如何在 Java 中使用带有 `^` 标志的 printf 使文本居中?

c - Linux 上 C 语言的 Dirent 迭代

c - 读取主函数中的参数时出现段错误

c - MPI 运行时错误 : Either Scatterv count error, segmentationfault,或卡住

c++ - 关于 std::stack push 段错误的问题

c - 两个文件都以二进制模式打开,无法从其他文件完全复制文件

c - 如何从数字中获取一些数字?

c - 如何在 C 中读取文本文件中的特定行(整数)

c - 共享内存程序不同步 - 出现段错误

c - 如何在 STM32F10x 上重定向 printf()?