我有一个相当简单的代码,它将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
很新