以下代码在程序退出之前崩溃。我已经在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()
上崩溃。