Memset 分段错误

Posted

技术标签:

【中文标题】Memset 分段错误【英文标题】:Memset segmentation fault 【发布时间】:2018-02-04 03:10:42 【问题描述】:

初始化二维数组后出现分段错误。我做了一些研究,但我不知道如何解决这个问题,有人可以帮助我吗?

我的数组的最大长度是 10000,必须设置可变长度。

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) 
 
    //Set dimension of matrices  
    int length = 10000;
    double matrix1[length][length]; 


    //This line ends up in segmentation fault.  
    memset( matrix1, 0, length*length*sizeof(double));

    return 0;

【问题讨论】:

什么是matrix2,为什么定义和memset中的数据类型不同? 抱歉,此代码示例中的拼写错误。我仍然有这个问题。感谢您的注意:) 10000 * 10000 * 8 = 800,000,000 【参考方案1】:

现代 C 编译器在堆栈上分配局部变量,堆栈的大小是有限的。您的变量double matrix1[length][length] 太大而无法容纳,这会导致堆栈溢出并导致分段错误。 (是的,甚至在调用memset 之前 也会出现段错误。)要么将matrix1 设为全局变量,要么将动态内存分配与malloc 一起使用。事实上,如果你使用calloc而不是malloc,就不需要memset

另一个选择是change the default stack size。

【讨论】:

具体来说,double[10000][10000] 类型的矩阵大约是 800 MB。典型的堆栈大小为 8 MB。 明白了,谢谢。我使它与: double matrix1 = (double *)malloc(lengthlength*sizeof(double));

以上是关于Memset 分段错误的主要内容,如果未能解决你的问题,请参考以下文章

C++中char指针中的memset的分段错误(核心转储)[重复]

aio_write 和 memset 无效参数和分段错误(核心转储)

memset 不使用指向字符的指针

为啥 memset() 的这种用法会出现段错误?

c ++ memset导致int**指针的段错误

这段代码一次执行良好,另一次出现分段错误