如果我这样做
int wsIdx [length];
我有一个segFault
但如果我这样做
int *wsIdx;
wsIdx = (int *)malloc(sizeof(int) * length );
没问题。
此问题仅在长度较高时出现,在我的测试期间为2560000。我有足够的记忆力。你能解释一下这两种分配方法之间的区别,以及为什么第一种方法不起作用?谢谢。
答案 0 :(得分:5)
第一个在“堆栈”(通常用于局部变量的区域)上分配,而第二个在“堆”上分配一个区域用于动态分配的内存。
您没有足够的堆栈空间以第一种方式分配,您的堆很大。
此SO讨论可能会有所帮助:What and where are the stack and heap?。
当你动态分配内存时,你总是可以通过检查malloc / calloc / etc的返回值来检查分配是否成功。不幸的是,在堆栈上分配内存时不存在这样的机制。
答案 1 :(得分:3)
假设length
不是常数,那么第一个形式是可变长度数组(VLA),你刚刚遇到了一个最大的问题。
最佳做法是避免使用“大型”数组的VLA,并使用malloc
代替,原因有两个:
他们没有机制报告分配失败,除了崩溃或导致其他一些未定义的行为。
通常在堆栈上分配VLA,其通常在尺寸上相对有限。所以它未能分配的可能性要高得多!
答案 2 :(得分:1)
暗示auto
被视为有害
为了同意已经给出的答案,如果错误代码是使用显式存储类编写的,那么这个常见问题可能会更加明显。
void
not_enough_stack(void)
{
auto int on_stack[2560 * 1000];
printf("sizeof(stack) %d\n", sizeof(on_stack));
}