C 静态分配整型数组时发生SEGFULT
如果我这样做C 静态分配整型数组时发生SEGFULT,c,malloc,C,Malloc,如果我这样做 int *wsIdx; wsIdx = (int *)malloc(sizeof(int) * length ); int wsIdx[长度] 我有一个缺点 但如果我这样做 int *wsIdx; wsIdx = (int *)malloc(sizeof(int) * length ); 没问题 此问题仅在长度较高时出现,在我的测试中为2560000。我有足够的记忆力。你能给我解释一下这两种分配方法的区别吗?为什么第一种方法不起作用?谢谢。第一个在“堆栈”(通常用于局部变量的区
int *wsIdx;
wsIdx = (int *)malloc(sizeof(int) * length );
int wsIdx[长度]
我有一个缺点
但如果我这样做
int *wsIdx;
wsIdx = (int *)malloc(sizeof(int) * length );
没问题
此问题仅在长度较高时出现,在我的测试中为2560000。我有足够的记忆力。你能给我解释一下这两种分配方法的区别吗?为什么第一种方法不起作用?谢谢。第一个在“堆栈”(通常用于局部变量的区域)上分配,而第二个在“堆”上分配,用于动态分配内存 您没有足够的堆栈空间来分配第一种方式,您的堆很大 这样的讨论可能会有所帮助: 动态分配内存时,始终可以通过检查malloc/calloc/etc的返回值来检查分配的成功或失败。。不幸的是,不存在这样的机制来分配堆栈上的内存
旁白:您可能喜欢阅读这个问题的上下文,尤其是:)假设
长度
不是常数,那么第一种形式是可变长度数组(VLA),您刚刚遇到了它们最大的问题之一
最佳做法是避免“大型”阵列使用VLA,而是使用malloc
,原因有二:
暗示
自动
被认为有害
与已经给出的答案一致,如果错误代码是使用显式存储类编写的,那么这个常见问题可能会更加明显
void
not_enough_stack(void)
{
auto int on_stack[2560 * 1000];
printf("sizeof(stack) %d\n", sizeof(on_stack));
}
您访问了解决此问题的正确网站。感谢您快速、良好的回复和链接。我要读它!