[英]memory allocation for 2D array of 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);
}
我在這些方面感到困惑
第一個警告是因為括號在表達式的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;
然后要分配內存,請記住您需要更改指針指向的內容。 所以你必須將指針傳遞給指針。 你的函數原型應該是:
void allocate (queue* (**arr) [COLUMNS]); // Note the (**arr)
函數調用應該是:
allocate (&arr);
(為了使指針間接更容易,您可能希望使用我在上面解釋的H2CO3首先建議的格式聲明並初始化allocate()
的不同指針到數組,然后將該指針指定給*arr
。)
請記住,您不僅要為指向2D數組的指針分配內存,還要為數組內的每個元素分配內存,因為該元素是未初始化的指針。 您可以使用allocate()
的嵌套循環執行此操作,或者,如果您的數據結構更符合邏輯,則使用fill_table()
。
對於fill_table()
,您可以簡單地將指針傳遞給數組本身。 原型將是:
void fill_table (queue* (*arr) [COLUMNS]);
和電話:
fill_table (arr);
希望這可以幫助。 最簡單的方法可能是在process()
內部開始執行所有操作,然后查看如何將分配和填充部分分離到自己的函數中。
1)你的第一個錯誤( queue* (**table)
)是你這里沒有2D數組,但是一個3D數組,你的行可以這樣寫: queue ***table
。 所以,你只需刪除一個星,你將聲明一個2D數組指針。
2)第一個回復,我想你不會再有這個警告了
3)這個錯誤就像第一個,你juste必須刪除一個明星。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.