C 导致seg故障的printf命令?
当我尝试初始化一个大的二维字符数组时,它工作得非常好。但是当我添加一个简单的print命令时,它会给我一个分段错误。你知道为什么会这样吗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命令不打印任何内容(即“”),它也可以正常工
#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
[...]