当我尝试初始化一个大型双维字符数组时,它的工作原理非常好。但是当我添加一个简单的打印命令时,它会给我一个分段错误。关于为什么会发生这种情况的任何想法?
#include<stdio.h>
int main(void)
{
printf("!");
char f[10000][10000];
}
没有printf命令,或者即使printf命令没有打印任何内容(即“”),它也能正常工作。如果我让它打印任何东西都会给出错误。
任何帮助?
答案 0 :(得分:3)
这可能是因为你超过了堆栈。您对f
的定义需要100MB堆栈空间(10000x10000字节),并且可能只要您实际使用堆栈,系统就会发现堆栈和segfault上没有那么多空间。您可能会在调用任何其他函数时发现相同的内容。
该大小的分配应通过malloc()完成。
char *f= malloc(10000*10000);
// access two dimensionally (equivalent of f[5][8])
char z= f[5*10000 + 8];
答案 1 :(得分:0)
您超出了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
增加它。