在分配staticaly一个int数组时的Segfault

时间:2012-07-21 12:18:57

标签: c malloc

如果我这样做

  

int wsIdx [length];

我有一个segFault

但如果我这样做

int *wsIdx;
wsIdx = (int *)malloc(sizeof(int) * length );

没问题。

此问题仅在长度较高时出现,在我的测试期间为2560000。我有足够的记忆力。你能解释一下这两种分配方法之间的区别,以及为什么第一种方法不起作用?谢谢。

3 个答案:

答案 0 :(得分:5)

第一个在“堆栈”(通常用于局部变量的区域)上分配,而第二个在“堆”上分配一个区域用于动态分配的内存。

您没有足够的堆栈空间以第一种方式分配,您的堆很大。

此SO讨论可能会有所帮助:What and where are the stack and heap?

当你动态分配内存时,你总是可以通过检查malloc / calloc / etc的返回值来检查分配是否成功。不幸的是,在堆栈上分配内存时不存在这样的机制。

除了:您可能会喜欢在此问题的上下文中阅读this,尤其是this part:)

答案 1 :(得分:3)

假设length不是常数,那么第一个形式是可变长度数组(VLA),你刚刚遇到了一个最大的问题。

最佳做法是避免使用“大型”数组的VLA,并使用malloc代替,原因有两个:

  1. 他们没有机制报告分配失败,除了崩溃或导致其他一些未定义的行为。

  2. 通常在堆栈上分配VLA,其通常在尺寸上相对有限。所以它未能分配的可能性要高得多!

答案 2 :(得分:1)

暗示auto被视为有害

为了同意已经给出的答案,如果错误代码是使用显式存储类编写的,那么这个常见问题可能会更加明显。

void
not_enough_stack(void)
{
    auto int on_stack[2560 * 1000];
    printf("sizeof(stack) %d\n", sizeof(on_stack));
}