[英]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.