为什么这个 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 = %dn", length);
        }
    }
    free(grid);
    return 0;
}

我还注意到我的恒定内存使用量显着增加,这意味着内存泄漏。所以这可能是一个堆问题。为什么会发生这种情况,我该如何解决?

可能发生

的情况是,您的"test_fgetc.txt"包含超过 64 个字符或超过 8 行字符。 这将准确地展示您正在经历的行为:它似乎有效,并且它会在free()上崩溃。

相关内容

  • 没有找到相关文章

最新更新