2017-06-13 92 views
1

我正在創建一個結構如何包含一個指針,指向指針結構,其是malloc的塊

typedef struct t{ 
    int top; 
    int value; 
    }s; 

和另一結構

typedef struct y{ 
     int top1; 
     s **p 
}z; 
    z *p1; 

由malloc的創建的塊索引結構

p1 = (z*) malloc(sizeof(z)); 
p1->p = (s**) malloc(10 * sizeof(s)); 

我嘗試索引s的結構塊由

p1->p[4]->top; 

但我得到錯誤。有沒有辦法將索引指針指向指針類型C

+1

不要施放'malloc'和朋友的結果! – Olaf

+0

@ tilz0R這很有趣。 – Stargateur

+0

重新「*但我得到錯誤*」,請提供錯誤信息! – ikegami

回答

3

用單個指針對它們進行尋址。

typedef struct y{ 
    int top1; 
    s *p; //Single pointer only 
}z; 

z *p1; 
p1 = malloc(sizeof(z)); //Don't cast... 
p1->p = malloc(10 * sizeof(s)); 

//And then: 
p1->p[4].top; 

如果你仍然想雙指針,則:

typedef struct y{ 
    int top1; 
    s **p; 
} z; 

z *p1; 
size_t i; 

p1 = malloc(sizeof(z)); //Create z structure object 
p1->p = malloc(10 * sizeof(*p1->p)); //Create array of pointers to objects 

//Now fill that array with your objects 
for (i = 0; i < 10; i++) { 
    p1->p[i] = malloc(sizeof(*p1->p[i])); 
} 

//Now access to property as: 
p1->p[4]->top; //Do something. 

第二個選項是不太可取,但取決於你自己,因爲連續做單一malloc爲10個對象是更有效比做單個對象的10倍和第11次初始化基本指針數組要多。

0

struct y{ ...; s **p }中,成員p表示指向結構s的指針,而不是指向結構s的指針。 因此p1->p[4]是指向s的指針,而不是s本身,因此您不能使用訪問者.訪問成員top。爲了解決編譯器錯誤,你必須使用訪問器->,它取消引用指針值,但是在運行時會產生未定義的行爲,因爲指針值沒有初始化。

爲了解決這個問題,你可以任意的p的數據類型更改爲s *p(由@ tilz0R的建議),或者你可以調整你的代碼實際上指針處理的指針:

typedef struct t{ 
    int top; 
    int value; 
}s; 

typedef struct y{ 
    int top1; 
    s **p; 
}z; 
z *p1; 

int main() { 
    p1 = malloc(sizeof(z)); 
    p1->p = malloc(10 * sizeof(s*)); 
    for (int i=0; i<10; i++) { 
     p1->p[i] = malloc(sizeof(s)); 
    } 

    p1->p[4]->top = 5; 

} 

注指向指針的指針的處理更復雜,因爲您需要一個額外的步驟/循環來初始化指針並在稍後釋放它們。所以實際上我更喜歡s *p -way;但有時指針的指針更合適,例如如果陣列的特定插槽應保持「空」;那麼你可以將相應的指針設置爲NULL,這在一個結構對象數組中是不可能的。