2D阵列的分段错误错误

时间:2011-12-19 01:22:57

标签: c segmentation-fault

有一个奇怪的分段错误错误。以下代码运行正常

#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;
}

可能的原因是什么?

2 个答案:

答案 0 :(得分:10)

您最有可能超出堆栈大小。

在用于运行此终端的终端中,请尝试输入

ulimit -s unlimited

并重新运行,假设您使用bash(或sh)在Linux系统上。

如果必须使用大小的数组,那么可以使它们变为动态,因此如果由于某种原因改变堆栈大小是有问题的,它们就在堆而不是堆栈上。

答案 1 :(得分:0)

正如tpg2114所说,分配大型矩阵并不是一个好主意。最简单的就是像那样分配它

double (*a)[matrixSize] = malloc(sizeof(double[matrixSize][matrixSize]));
.
free(a);

然后,您可以像以前一样继续使用嵌套的for循环进行初始化而不会出现问题。

NB:

  • 因为您使用变量作为矩阵的维度 技术上是一个可变长度数组,仅适用于C99
  • 您对main的定义不符合标准。在你的 你应该使用int main(void) { ... }。因为符合标准的编译器应该捕获它,看起来你没有为你的编译器使用正确的选项,或者你忽略了他给你的警告。
  • 因为它们代表大小,您的变量matrixSizei j类型应为size_t,而不是int