Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 静态分配整型数组时发生SEGFULT_C_Malloc - Fatal编程技术网

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
,原因有二:

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

  • VLA通常在堆栈上分配,堆栈的大小通常相对有限。因此,it无法分配的可能性要高得多


  • 暗示
    自动
    被认为有害

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

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

    您访问了解决此问题的正确网站。感谢您快速、良好的回复和链接。我要读它!