gpt4 book ai didi

为二维数组调用 free() 会产生 seg。过错

转载 作者:行者123 更新时间:2023-12-03 15:30:49 25 4
gpt4 key购买 nike

我正在努力学习 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;
}

结构 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);
}

但是在第一个 free(g->grid[i]) 上我收到一个段错误。

为什么这不起作用?我该如何解决这个问题?

编辑:

程序中已经包含stdbool.h,用于bool/true/false的使用。

我觉得盲目地盯着 free() 语句真的很愚蠢。当我将程序缩小到绝对最小值时,它与 free() 语句配合得很好。当我在某一点访问和写入网格时,free() 用段错误来迎接我。

接受 user1083265 的回答。

最佳答案

我编译了你的代码(只是分配/取消分配)并且它没有崩溃。

可能,在使用分配的网格时,您破坏了分配的片段上方的一些内存。 Glibc 使用 canary values检测此类损坏 - 因此在释放损坏的内存时会出现段错误。

关于为二维数组调用 free() 会产生 seg。过错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8769181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com