gpt4 book ai didi

c - 二维指针数组的内存分配

转载 作者:行者123 更新时间:2023-12-04 09:32:51 27 4
gpt4 key购买 nike

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

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

警告:

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. 我不确定我声明的二维指针数组是否正确
  2. 如何传递这个二维指针数组

最佳答案

第一个警告是因为括号对表达式的 LHS 没有影响

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

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

因为table是一个三级指针,table[indexI]是一个二级指针。但是你在表达式的 RHS 上不一致:

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

malloc 再次返回一个指向内存块的指针,该内存块可以容纳三个指向队列的指针(即,malloc 返回一个二级指针)但是你将其重新转换为一级指针,然后将其分配给二级指针。

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

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

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

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

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

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

然后分配内存,记住你需要改变指针指向的地方。所以你必须传递一个指向指针的指针。你的函数原型(prototype)应该是:

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

函数调用应该是:

allocate (&arr);

(为了使指针间接更容易,您可能想要在 allocate() 中使用我在上面解释过的 H2CO3 首先建议的格式声明和初始化一个不同的指向数组的指针,然后分配它指向 *arr 的指针。)

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

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

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

和调用:

fill_table (arr);

希望这对您有所帮助。最简单的方法可能是首先在 process() 中执行所有操作,然后看看如何将分配和填充部分分离到它们自己的函数中。

关于c - 二维指针数组的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18041869/

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