printf命令导致seg错误?

当我尝试初始化一个大的双维字符数组时,它工作得非常好。 但是当我添加一个简单的打印命令时,它会给我一个分段错误。 有关为什么会发生这种情况的任何想法?

#include int main(void) { printf("!"); char f[10000][10000]; } 

没有printf命令,或者即使printf命令没有打印任何内容(即“”),它也能正常工作。 如果我让它打印任何东西它会给出错误。

有帮助吗?

这可能是因为你超过了堆栈。 您对f定义需要100MB堆栈空间(10000×10000字节),并且可能只要您实际使用堆栈,系统就会发现堆栈和segfault上没有那么多空间。 您可能会在调用任何其他函数时发现相同的内容。

该大小的分配应该通过malloc()完成。

  char *f= malloc(10000*10000); // access two dimensionally (equivalent of f[5][8]) char z= f[5*10000 + 8]; 

您超出了C实现的未指定限制,特别是具有自动存储持续时间的对象的总大小(也称为“本地变量”)。 f[]的大小是100.000.000字节。 许多C实现将自动变量保留在堆栈上,这通常是有限的资源。 在我的Unix系统(FreeBSD)上,我可以检查这个限制:

 $ ulimit -a -t: cpu time (seconds) unlimited -f: file size (blocks) unlimited -d: data seg size (kbytes) 33554432 -s: stack size (kbytes) 524288 [...] 

如果更高的权力允许,用ulimit -s number增加它。