gpt4 book ai didi

c - 表中的边界值覆盖邻居

转载 作者:太空宇宙 更新时间:2023-11-04 03:48:25 25 4
gpt4 key购买 nike

我正在编写一个 C 程序,我在其中尝试动态分配一个 2-dim 数组(或数组数组)。分配表后,我尝试对其进行迭代,但它会引发有关非法内存的错误访问并创建核心转储。

经过一番调查后,我发现了一件奇怪的事情:我试验的数组是 4x4,但是当我设置 array[0][3] = 123; 时,它同时设置了[0][3] 和 [1][0] 位置为 123。如果我分配 array[1][0] = 123;,就会发生完全相同的事情,因为将 [0][3] 和 [1][0] 都设置为右侧值。对任何“边界值”进行类似的分配,如 [2][0] 和 [1][3]。我想我的分配一定有问题,但我想不通。我很确定这是动态分配 multi-dim 数组的方法,一些研究证实了这一点。这是我的代码(我知道它应该是 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]);

是我的内存分配有误,还是我没看到的其他问题。如果有任何建议或帮助,我将不胜感激。提前谢谢你。

最佳答案

typedef struct {
int rows;
int columns;
double **data;
} matrix;

这是罪魁祸首。 DOUBLE 宏定义本应通过代码启用 double ,但当未设置标志时,代码仍分配 double** data,从而导致可能的段错误。这种情况下的正确代码应如下所示:

typedef struct {
int rows;
int columns;
#ifdef DOUBLE
double **data;
#else
float **data;
#endif
} matrix;

关于c - 表中的边界值覆盖邻居,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22623390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com