我对动态内存分配和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);
}
我在这些方面感到困惑
答案 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)这个错误就像第一个,你必须删除一个星。