2012-01-07 86 views
3

我正在努力学习C语言,我已经到了一个地步,我觉得要尝试一些比打印文本到控制台的小而简单的例子更先进的事情,以非常简单的方式使用指针等等。为二维数组调用free()会导致seg。错误

的问题是,我的程序崩溃,我呼吁免费的,我敢肯定,这是指针(一个或多个)莫名其妙地纠缠着我......

所以,我创建了这样一个二维数组:

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->电网[1])我收到分段错误。

为什么这不起作用?我怎样才能解决这个问题?

编辑:

stdbool.h已列入计划使用布尔/真/假的。

我觉得在free()语句中瞎了眼睛真的很愚蠢。当我将程序减小到最小值时,它对free()语句非常有用。当我访问并写入网格的时候,free()向我提出了分段错误。

正在接受user1083265的回答。

+0

您可以添加一个调用'InitializeGrid'和'CleanupGrid'并导致段错误的最小'main'函数吗?另外,在C中没有'true'和'false'这样的东西。你应该用1和0替换它们,或者在别处替换它们#include。 – Jan 2012-01-07 11:20:17

+0

@Jan'',自1999年起成为C的一部分。 – 2012-01-07 11:51:12

回答

3

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

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

+0

该代码也适用于我。 – MARK 2012-01-07 11:18:03