【问题标题】:Memset segmentation faultMemset 分段错误
【发布时间】: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

标签: c segmentation-fault stack-overflow memset


【解决方案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));
猜你喜欢
  • 1970-01-01
  • 2020-06-15
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-12
相关资源
最近更新 更多