printf命令导致seg错误?

时间:2013-06-02 16:49:00

标签: c arrays segmentation-fault printf stack-overflow

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

#include<stdio.h>
int main(void)
{
    printf("!");  
    char f[10000][10000];
}

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

任何帮助?

2 个答案:

答案 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增加它。