我正在努力学习C而且我已经达到了一个目的,我想要尝试一些更先进的东西,而不是简单的将文本打印到控制台的示例,使用指针以非常简单的方式等等。 / p>
问题是我的程序在我的免费调用中崩溃了,我确定这是指针在某种程度上困扰着我......
所以,我创建了一个像这样的二维数组:
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;
}
结构Grid看起来像这样:
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-&gt;网格[i])上,我收到了分段错误。
为什么这不起作用?我该如何解决这个问题?
编辑:
stdbool.h已包含在程序中,用于使用bool / true / false。
我因为盲目地看着free()声明而感到非常愚蠢。当我将程序缩小到绝对最小值时,它对free()语句很有用。当我在一个点访问和写入网格时,free()用分段错误问候我。
接受user1083265的回答。
答案 0 :(得分:3)
我编译你的代码(只是alloc / dealloc)并且它不会崩溃。
当使用分配的网格时,可能会损坏分配的片段上方的一些内存。 Glibc使用canary values来检测这种损坏 - 因此在释放损坏的内存时会出现段错误。