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的分段错误(核心转储)[重复]