Почему этот код C (чтение файла) падает при выходе (или перераспределении файла)?

Следующий код вылетает прямо перед выходом из программы. Я проверил это на MSVS 2015 и GCC. Программа просто назначает VLA в куче (читайте об этом здесь, если хотите) и читает символьное содержимое файла и сохраняет этот символ в массиве. Программа работает на отлично. Это делает и печатает все правильно. Однако при выходе он вылетает или перестает отвечать.

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define rows 8
#define columns 8

// allocate a VLA on the heap
void allocateVLArray(int x, int y, char(**ptr)[rows][columns])
{
    *ptr = malloc(sizeof(char[rows][columns]));
    assert(*ptr != NULL);
}

int main()
{
    char (*grid)[rows][columns];
    allocateVLArray(rows, columns, &grid);

    if (grid) {
        FILE *inputFile = fopen("test_fgetc.txt", "r");
        if (inputFile) {
            int x = 0, y = 0, length = 0;
            char ch;

            while((ch = (char)fgetc(inputFile)) != EOF) {
                // CR and LF characters are captured together (if necessary) and counted as one char using '\n'
                if (ch == '\n') {
                    x++; y = 0;
                }
                else {
                    *grid[x][y] = ch;
                    y++;
                }
                length++;
            }

            for (x = 0; x < rows; x++) {
                for (y = 0; y < columns; y++) {
                    printf("%c", *grid[x][y]);
                }
                printf("\n");
            }

            printf("\nlength = %d\n", length);
        }
    }

    free(grid);

    return 0;
}

Я также заметил, что мое постоянное использование памяти значительно увеличилось, что означает утечки памяти. Так что это, вероятно, проблема кучи. Почему это происходит и как я могу это исправить?

1 ответ

Решение

BLUEPIXY дал правильный ответ в комментарии выше. Проблема в том, что *grid[x][y] должно было (*grid)[x][y], Скобочные операторы [] имеют больший приоритет, чем *,

(Было бы лучше игнорировать любые другие комментарии, кроме BLUEPIXY на этой странице.)

Вероятно, происходит то, что ваш "test_fgetc.txt" содержит более 64 символов или более 8 строк символов. Это продемонстрировало бы именно то поведение, которое вы испытываете: оно, казалось бы, работает, и оно зависло бы на free(),

Другие вопросы по тегам