我正在努力学习C,我已经到了一个地步,我想尝试一些比将文本打印到控制台、以非常简单的方式使用指针等小而简单的例子更高级的东西。
问题是,我的程序在我调用free时崩溃了,我确信是指针在某种程度上困扰着我…
因此,我创建了一个二维数组,如下所示:
bool InitializeGrid(struct Grid *g, int rows, int columns)
{
g->rows = rows;
g->columns = columns;
g->grid = malloc(g->rows * sizeof(int *));
if(g->grid == NULL)
{
printf("Could not allocate memory for grid rows.n");
return false;
}
for (int i = 0; i < g->rows; i++)
{
g->grid[i] = malloc(g->columns * sizeof(int));
if(g->grid[i] == NULL)
{
printf("Could not allocate memory for grid columns.n");
return false;
}
}
/ ... /
return true;
}
网格结构如下:
struct Grid
{
int rows;
int columns;
int **grid;
};
然后我成功地在整个程序中使用了网格,一切都很好。当程序即将退出时,我需要/想要释放我分配的内存。我就是这样做的:
void CleanupGrid(struct Grid *g)
{
for(int i = 0; i < g->rows; i++)
free(g->grid[i]);
free(g->grid);
}
但在第一个空闲(g->grid[i])上,我收到一个分段错误。
为什么这不起作用?我该怎么解决这个问题?
编辑:
stdbool.h已包含在程序中,以便使用bool/true/false。
我对free()语句视而不见,觉得自己真的很愚蠢。当我将程序缩小到绝对最小值时,它与free()语句配合得很好。当我访问并写入网格时,free()会出现分段错误。
正在接受用户1083265的回答。
我编译了你的代码(只是alloc/dealloc),它不会崩溃。
可能,在使用已分配的网格时,您损坏了已分配片段之上的一些内存。Glibc使用canary值来检测这种损坏,因此在释放损坏的内存时会得到segfault。