Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 导致seg故障的printf命令?_C_Arrays_Segmentation Fault_Printf_Stack Overflow - Fatal编程技术网

C 导致seg故障的printf命令?

C 导致seg故障的printf命令?,c,arrays,segmentation-fault,printf,stack-overflow,C,Arrays,Segmentation Fault,Printf,Stack Overflow,当我尝试初始化一个大的二维字符数组时,它工作得非常好。但是当我添加一个简单的print命令时,它会给我一个分段错误。你知道为什么会这样吗 #include<stdio.h> int main(void) { printf("!"); char f[10000][10000]; } #包括 内部主(空) { printf(“!”); 字符f[10000][10000]; } 不使用printf命令,或者即使printf命令不打印任何内容(即“”),它也可以正常工

当我尝试初始化一个大的二维字符数组时,它工作得非常好。但是当我添加一个简单的print命令时,它会给我一个分段错误。你知道为什么会这样吗

#include<stdio.h>
int main(void)
{
    printf("!");  
    char f[10000][10000];
}
#包括
内部主(空)
{
printf(“!”);
字符f[10000][10000];
}
不使用printf命令,或者即使printf命令不打印任何内容(即“”),它也可以正常工作。如果我让它打印任何东西,它就会出错


有什么帮助吗?

这可能是因为您超出了堆栈。您对
f
的定义需要100MB的堆栈空间(10000x1000字节),很可能一旦您实际使用了堆栈,系统就会发现堆栈上没有那么多空间,并且会出现错误。您可能会发现调用任何其他函数都是如此

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


您超过了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数增加它

我想用普通的“C”语言你会得到一个编译错误(在非定义语句后定义f)。@Nicholaz,OP的程序在C99或更新版本中很好(C99已经有15年历史了)。@Carl:好的,明白了。。。(我还是更老派:-)通常静态存储类分配也可以。为什么不分配一个2D数组而不是自己做访问乘法练习呢?+1。或者,
char(*f)[10000]=malloc(sizeof(*f)*10000)
也可以避免堆栈溢出,同时仍然允许将
f
索引为二维数组。使
f
静态可能会产生不吸引人的副作用-一个100Mb的可执行文件要映射到内存中。@simonc,使
f
静态可能不会影响可执行文件的大小-它将被初始化为零。。。。为了达到极致,您可以将其分配为
char(*f)[10000][10000]=malloc(sizeof*f)
。请记住,在这种情况下,您必须以
(*f)[i][j]
:)的身份访问它。。。我刚刚想到,这个问题就是这个网站的缩影,一个堆栈溢出:-)
$ ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          33554432
-s: stack size (kbytes)             524288
[...]