2

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

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

它可以在没有 printf 命令的情况下正常工作,或者即使 printf 命令什么也不打印(即“”)。如果我让它打印任何东西,它会给出错误。

有什么帮助吗?

4

2 回答 2

3

这可能是因为您超出了堆栈。您的定义f占用 100MB 堆栈空间(10000x10000 字节),并且可能一旦您实际使用堆栈,系统就会发现堆栈和段错误没有那么多空间。调用任何其他函数时,您可能会发现相同的情况。

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

   char *f= malloc(10000*10000);

   // access two dimensionally (equivalent of f[5][8])
   char z= f[5*10000 + 8];
于 2013-06-02T16:54:08.677 回答
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

于 2013-06-02T19:42:58.627 回答