有一个奇怪的分段错误错误。以下代码运行正常
#include <stdlib.h>
#include <stdio.h>
main()
{
int matrixSize = 1000;
int i,j;
double a[matrixSize][matrixSize];
for (i = 0; i < matrixSize; i++)
for (j = 0; j < matrixSize; j++)
a[i][j] = rand() % 10;
double b[matrixSize][matrixSize];
for (i = 0; i < matrixSize; i++)
for (j = 0; j < matrixSize; j++)
b[i][j] = rand() % 10;
return 0;
}
但是当我尝试再初始化一个2D数组时,我得到“分段错误”异常:
#include <stdlib.h>
#include <stdio.h>
main()
{
int matrixSize = 1000;
int i,j;
double a[matrixSize][matrixSize];
for (i = 0; i < matrixSize; i++)
for (j = 0; j < matrixSize; j++)
a[i][j] = rand() % 10;
double b[matrixSize][matrixSize];
for (i = 0; i < matrixSize; i++)
for (j = 0; j < matrixSize; j++)
b[i][j] = rand() % 10;
return 0;
}
可能的原因是什么?
答案 0 :(得分:10)
您最有可能超出堆栈大小。
在用于运行此终端的终端中,请尝试输入
ulimit -s unlimited
并重新运行,假设您使用bash(或sh)在Linux系统上。
如果必须使用大小的数组,那么可以使它们变为动态,因此如果由于某种原因改变堆栈大小是有问题的,它们就在堆而不是堆栈上。
答案 1 :(得分:0)
正如tpg2114所说,分配大型矩阵并不是一个好主意。最简单的就是像那样分配它
double (*a)[matrixSize] = malloc(sizeof(double[matrixSize][matrixSize]));
.
free(a);
然后,您可以像以前一样继续使用嵌套的for
循环进行初始化而不会出现问题。
NB:
main
的定义不符合标准。在你的
你应该使用int main(void) { ... }
。因为符合标准的编译器应该捕获它,看起来你没有为你的编译器使用正确的选项,或者你忽略了他给你的警告。matrixSize
,i
j
类型应为size_t
,而不是int
。