簡體   English   中英

2D指針數組的內存分配

[英]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);

}

我在這些方面感到困惑

  1. 我不確定我的2D指針數組的聲明是否正確
  2. 如何傳遞這個2D指針數組

第一個警告是因為括號在表達式的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM