c-对2D数组调用free()会导致seg.过错



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

相关内容

  • 没有找到相关文章

最新更新