2017-02-03 47 views
0

我有兩個結構:C. MALLOC其具有結構指針作爲成員變量一個結構陣列

struct Parent { 
    struct *Child child; // Pointer to a child 
} 

struct Child { 
    int id; 
} 

我想初始化「父」

int size = 2; 
struct Parent *parents = (struct Parent*) malloc(sizeof(struct Parent) * size); 

這打破時的陣列運行。

任何解決方案?

我想在這樣的方式來初始化:

struct Parent { 
    struct *Child child = nullptr; // Points to null upon initialization. 
} 
+0

'C'或'C++',答案會有所不同。 – user975989

+0

@ user975989 c請 –

+1

此代碼不會編譯。 'struct'聲明後缺少分號; 'struct * Child; //指向一個孩子'是沒有意義的,應該是'struct Child * field;';需要轉發declare'struct Child'。請提供[mcve]。 –

回答

0

克里斯·維格帶來了一個好點,但我認爲你是搭售需要做的就是這個

#include <iostream> 
struct Child { 
    int id; 
}; 
struct Parent { 
    struct Child* c ; // Pointer to a child 
}; 
int main() { 
    int size = 2; 
    struct Parent *parents = (struct Parent*) malloc(sizeof(struct Parent) * size); 
} 
+1

可能,但OP尚未與實際的代碼清理尚未.... IAC,OP聲稱C代碼中的註釋,所以'#include '和'int main(void)'。此外,更好的C風格使用'struct Parent * parents = malloc(sizeof(* parents)* size);'最好避免強制轉換'malloc()'並在'sizeof()'中使用標識符。 –

+0

@DavidBowling也可以是'struct Parent * parents = malloc(sizeof * parents * size);'。 – RoadRunner

0

既然你提到你想要C--你可以使用memset初始化內存(包括child指針)爲全零。

size_t size = 2 * sizeof(struct Parent); 
struct Parent* parents = (struct Parent*)malloc(size); 
memset(parents, 0, size); 

這將初始化整個parents數組爲全零。否則,它將被初始化爲分配時在內存中發生的任何事情。

在C++中的適當解決方案將有顯着不同(使用new[]和構造函數來初始化結構)。

0

C我使用calloc()而不是malloc()

因爲,calloc()歸零返回的內存,malloc()沒有。

但是,如果你想在分配後將內存歸零,我個人更喜歡bzero(),因爲它的目的是明確的,比memset()少一個參數。我通常會使用memset()可以用這個原因填充非零值。

+0

請注意,不能保證由全零字節組成的指針表示是有效的空指針。 – Random832

+0

@ Random832咦?我不明白,calloc()不會使指針歸零,它將分配內存的內容清零。 – clearlight

+0

是的,分配內存的內容包含「子」指針。不能保證調零就等於將其設置爲null(或者對於浮點類型爲零值),即使它在許多實現中碰巧是真的。 – Random832