簡體   English   中英

C關於指針對內存分配的困惑?

[英]C Confusion about pointer to pointers memory allocation?

對於可能被視為重復的內容,我深表歉意,但是我似乎找不到一個能滿足我的問題的結論性答案。 因此,我有一個帶有指向指針的自引用指針的結構。

struct Node {
    int id;
    int edge_count;
    struct Node **edges;
}

static struct Node s_graph[MAX_ID+1];

然后,我有一個分配一些內存的函數。

int add_edge(int tail, int head)
{
    struct Node *ptail, *phead;
    ptail = &s_graph[tail];
    phead = &s_graph[head];

    ptail->edges = realloc(ptail->edges, ++ptail->edge_count * sizeof(struct Node *));
    if (ptail->edges) {
       *(ptail->edges + ptail->edge_count - 1) = phead;
       return 0;   
   }
   return -1;
}

以上似乎工作正常。 但是,我一直看到有關指針的帖子,這使我想知道是否需要在add_edge中執行以下操作:

struct Node *phead = malloc(sizeof(struct Node *));

但是,這似乎不合邏輯。 在realloc調用之后,應該有足夠的內存用於ptail-> edges存儲此指針。 我相當有信心我正確地進行了分配(盡管效率很低),但這有點使我發狂……因此,當人們聲明指針的指針(例如** ptr),然后為兩者分配內存時ptr和* ptr,從技術上講,這不會使ptr成為指向指針的指針的指針(也許更清楚地聲明為*** ptr)嗎? 或者,也許我錯了,在概念上缺少某些東西?

先感謝您!

這取決於情況,沒有普遍的答案。 如果您有一個指向指針的指針,例如Node** ,並且想要將新數據存儲到其中,則需要具有兩個分配級別,否則一個分配就足夠了。

struct Node** nodes = calloc(AMOUNT, sizeof(struct Node*));

現在,您有了一個struct Node*元素數組,因此每個元素都是一個指向struct Node的指針。

現在,您如何填充此數組? 您可能想在其中插入新節點。 然后您需要分配它們,例如

nodes[0] = calloc(1, sizeof(struct Node)); // <- mind Node, not Node*

但是在您的情況下,您只想將地址設置為靜態變量s_graph的數組的元素,因此您無需分配第二級,您可以直接設置該值。

所以:

struct Node** nodes = calloc(AMOUNT, sizeof(struct Node*));

nodes -> |   0   |   1   |   2   |   3   |

nodes[0] = calloc(1, sizeof(struct Node))

nodes -> |   0   |   1   |   2   |   3   |
             |
             |
             v
         |    NODE    |

但是,如果您有s_graph ,則已經分配了它們,所以就像:

static struct Node s_graph[MAX_ID+1];
struct Node** nodes = calloc(AMOUNT, sizeof(struct Node*));

nodes -> |   0   |   1   |   2   |   3   |
s_graph -> |      N1      |      N2      |      N3      | 

nodes[0] = &s_graph[0];

nodes -> |   0   |   1   |   2   |   3   |
             |
             |----|
                  v
s_graph -> |      N1      |      N2      |      N3      | 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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