Почему этот код 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()
,