为2D数组调用free()会产生seg。故障

时间:2012-01-07 11:04:56

标签: c pointers crash malloc free

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

1 个答案:

答案 0 :(得分:3)

我编译你的代码(只是alloc / dealloc)并且它不会崩溃。

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