Значения границ в таблице перезаписывают соседей

Я пишу программу на 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;
Другие вопросы по тегам