2D指针数组的内存分配

时间:2013-08-04 10:17:07

标签: c pointers

我对动态内存分配和2D指针数组的删除感到非常困惑。

目标是拥有一个2D数组,其中每个单元格都有一个指向链表的指针。 这就是我正在做的事情,我没有看到任何错误,只有很少的警告。

警告:

1)

a value of type queue ** cannot be used to initialize an entity of type queue ***
queue* (**table) = (queue**)malloc(sizeof(queue*)*3);

2)

a value of type queue * cannot be assigned to an entity of type queue **
    table[indexI] = (queue*)malloc(sizeof(queue*)*3);

3)

a value of type queue ** cannot be assigned to an entity of type queue ***
  if( !(table = allocate()) ) {

以下是代码:

queue **allocate() {

    queue* (**table) = (queue**)malloc(sizeof(queue*)*3);
    // Warning #1 at above line 
    for(.....) {

    table[index] = (queue*)malloc(sizeof(queue*)*3);
    // Warning #2 at above line. 
    }

    for(I index - 0 to 3) {
    for(J index - 0 to 3) {

    table[I][J] = NULL;

    }
    }
    return((queue**)table);
   }

    void deallocate(queue* **table) {


    // will handle list deletion
    // next deallocate table

    for(....) {
    free(table[index]);
    }
    free(table);

   }

void
add_list_to_queue(queue ***table) {

// here I create a list of queue type and assign it to
// those cells

}

modify_table() {

    queue* (**table) = NULL;

    table = allocate();
// Warning #3 at above line
.
.
.
    add_list_to_queue(table);

// do de allocation of table, list etc.,

    deallocate(table);

}

我在这些方面感到困惑

  1. 我不确定我的2D指针数组的声明是否正确
  2. 如何传递这个2D指针数组

2 个答案:

答案 0 :(得分:2)

第一个警告是因为括号在表达式的LHS中没有区别

queue* (**table) = (queue**)malloc(sizeof(queue*)*3);

table只是指向队列的三级指针。但是malloc返回一个指向内存块的指针,该内存块可以容纳三个指向队列的指针,因此您要为队列分配一个两级指针。

由于table是一个三级指针,table[indexI]是一个两级指针。但你对表达式的RHS不一致:

table[indexI] = (queue*)malloc(sizeof(queue*)*3);

malloc再次返回一个指向内存块的指针,该内存块可以容纳三个指向队列的指针(即,malloc正在返回一个两级指针)但是你将它作为一个指针投射-level指针,然后将其分配给两级指针。

对于第三个警告,您已将allocate()定义为返回指向队列指针的指针,但您尝试将其分配给table。如上所述,table是一个三级指针,但allocate()只返回一个两级指针。

但实际上,指针间接的多个级别并不是你需要的。把事情简单化。你需要什么?指向行的指针,每行包含指向队列的指针。这就是H2CO3在他的评论中给出的建议:

queue *(*arr)[COLUMNS] = malloc(sizeof(*arr) * ROWS);

arr是指向ROWS数组的指针,每行包含指向queue的COLUMNS指针。

编辑:要按照您在评论中的要求将其传递给不同的函数,首先声明并初始化指针:

queue* (*arr) [COLUMNS] = NULL;

然后要分配内存,请记住您需要更改指针指向的内容。所以你必须将指针传递给指针。你的函数原型应该是:

void allocate (queue* (**arr) [COLUMNS]);  // Note the (**arr)

函数调用应该是:

allocate (&arr);

(为了使指针间接更容易,您可能希望使用我在上面解释的H2CO3首先建议的格式声明并初始化allocate()内的不同指针到数组,然后将该指针指定给{{1 }}。)

请记住,您不仅要为指向2D数组的指针分配内存,还要为数组内的每个元素分配内存,因为该元素是未初始化的指针。您可以使用*arr中的嵌套循环执行此操作,如果您的数据结构更符合逻辑,则可以allocate()执行此操作。

对于fill_table(),您可以简单地将指针传递给数组本身。原型将是:

fill_table()

和电话:

void fill_table (queue* (*arr) [COLUMNS]);

希望这会有所帮助。最简单的方法可能是先在fill_table (arr); 内完成所有操作,然后看看如何将分配和填充部分分离到自己的函数中。

答案 1 :(得分:0)

1)你的第一个错误(queue* (**table))是你没有2D数组,但是3D数组,你的行可以这样写:queue ***table。所以,你只需删除一个星,你将声明一个2D数组指针。

2)第一个回复,我想你不会再有这个警告了

3)这个错误就像第一个,你必须删除一个星。