我正在写一个C程序,其中我尝试动态分配一个2-dim数组(或数组数组)。在表分配后,我试着迭代它,但它抛出关于非法内存访问的错误并创建一个coredump。表中的边框值覆盖邻居
经过一番研究,我发现了一种奇怪的事:余与实验阵列是4×4,但是当我设置array[0][3] = 123;
它设置既[0] [3]和[1] [0]的位置为123如果我将array[1][0] = 123;
分配给版权值,因为它将[0] [3]和[1] [0]都设置为版权值,所以会发生完全相同的情况。对任何“边界值”(如[2] [0]和[1] [3])进行类似的分配。我想我的配置一定是错的,但我无法弄清楚。我非常确定这是动态分配多光暗阵列的方式,一些研究证实了这一点。这里是我的代码(我知道这应该是SSSCE,但我无法提供更短,仍然显示问题):
typedef struct {
int rows;
int columns;
double **data;
} matrix;
matrix* allocateMatrix(int inputRows, int inputColumns) {
matrix *matrixPointer = calloc(1, sizeof(matrix));
matrixPointer->rows = inputRows;
matrixPointer->columns = inputColumns;
#ifdef DOUBLE
matrixPointer->data = calloc(inputRows, sizeof(double*));
#else
matrixPointer->data = calloc(inputRows, sizeof(float*));
#endif
if (matrixPointer->data == NULL) {
printf("Error - inputRows value appears to be wrong.");
return NULL;
}
int i, j;
for (i = 0; i < inputRows; i++) {
#ifdef DOUBLE
matrixPointer->data[i] = calloc(inputColumns, sizeof(double));
#else
matrixPointer->data[i] = calloc(inputColumns, sizeof(float));
#endif
if (matrixPointer->data[i] == NULL) {
printf("Error - inputColumns value appears to be wrong.");
return NULL;
}
}
matrixPointer->data[2][0] = 123; //TEST CODE;
return matrixPointer;
}
而且一些代码,看到这样创建数组的内容:
matrix *lol = allocateMatrix(4, 4);
int i, j;
for (i = 0; i < lol->rows; i++)
for (j = 0; j < lol->columns; j++)
printf("%f ", lol->data[i][j]);
我的内存分配是否错误,或者是我看不到的其他问题。我会很感激任何建议或帮助。先谢谢你。
男人,在没有发现任何明确的错误代码后,我决定运行它。它工作得很好。 确保您正在编译和测试代码的最新版本。如果它没有解决,编译器可能会有一个“问题” – Inox
今天再次运行它没有进展。由于这是学术性的东西,我正在用GCC编译它。仍然,将数组[1] [0]设置为123会将[1] [0]和[0] [3]设置为123 ... – 3yakuya