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