分段错误:11将值初始化为数组

时间:2015-10-18 10:42:58

标签: c arrays segmentation-fault

我有一个相当简单的代码,它将double值分配给两个数组,然后获取它们的外部产品。这是代码:

int i, j;

double A[1000][1000];
double B[1000][1000];

for (i = 0; i < 1000; i++) {
    for(j = 0; j < 1000; j++) {
        A[i][j] = (double)rand()/(double)RAND_MAX;
        B[i][j] = (double)rand()/(double)RAND_MAX;
        // Segmentation fault occurs in here somewhere.
    }
}

// Take outer product, not even saving the result at this point

据我所知,当没有剩余内存时可能会发生分段错误,这是因为我只得到723x723以上数组的错误。没有意义的是,两个1000x1000双值数组不接近我的16GB内存,两个723x723阵列已经比缓存大。此外,在初始化值时会发生错误,如果数组太大,在声明它们时不会抱怨吗?

建议任何人?

编辑: 经过一些调试后,我发现如果它们太大,我就无法访问数组中的任何元素,即

A[0][0] = 1.0;

还会导致分段错误。

更新:我尝试使用以下命令将声明替换为全局:

double **A = malloc(size * sizeof *A);

double **A = malloc(size * size * sizeof(double));

在这两种情况下,无论数组大小如何,它现在都会给出分段错误。

使数组静态工作,但只有当我将大小硬编码到其中时,否则编译器会抱怨“可变长度数组声明不能具有'静态'存储持续时间”

已解决:有点愚蠢,但只需按照以下方式进行全球声明:

double **A = maloc(size * sizeof *A);
for (i = 0; i < size; i++) {
    A[i] = maloc(size * sizeof *A);
}

不完全确定原因,但那只是因为我对c

很新

0 个答案:

没有答案