gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:00:22 29 4
gpt4 key购买 nike

我想知道为什么其中一些程序会抛出段错误,而另一些则不会。

这个程序抛出一个段错误:

#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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com