Значения границ в таблице перезаписывают соседей
Я пишу программу на C, в которой я пытаюсь динамически выделить 2-мерный массив (или массив массивов). После размещения таблицы я пытаюсь перебрать ее, но она выдает ошибку о недопустимом доступе к памяти и создает 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]);
Неправильно ли выделено мое память, или, может быть, я не вижу другой проблемы. Буду благодарен за любые предложения или помощь. Заранее спасибо.
1 ответ
typedef struct {
int rows;
int columns;
double **data;
} matrix;
Это виновник. Макроопределение DOUBLE должно было обеспечивать двойную точность в коде, но когда флаг не был установлен, код по-прежнему выделялся double** data
, вызывая возможные ошибки сегментации. Правильный код в этом случае должен выглядеть так:
typedef struct {
int rows;
int columns;
#ifdef DOUBLE
double **data;
#else
float **data;
#endif
} matrix;