2013-09-05 128 views
0

我想初始化一個包含不同類型變量的結構體。例如,假設我有初始化一個包含指向結構體指針的指針的結構體

struct population { 
    int *ids; 
    double *incomes; 
    struct good **goodsdistn; // This is the one I am having trouble with. 
}; 

struct population popn; 

我想用另一種結構中定義的參數進行初始化popn,說

struct params { 
    int numpeople; 
    // there are other parameters here, not relevant for the question. 
}; 

struct params parameters = {.numpeople = 50}; 

要初始化popn我想執行以下操作:

(1)定義以下功能外main()

void create_population(struct population *popn, struct params *parameters) 
{ 
    popn -> ids = malloc(sizeof(int) * parameters -> numpeople); //This works 
    popn -> incomes = malloc(sizeof(double) * parameters -> numpeople); //This works 
    popn -> goodsdistn = malloc(sizeof(???) * parameters -> numpeople); 
    // What do I put in place of ??? when I have a pointer to a pointer to struct good. 

} 

(2)在main()調用此函數來初始化popn(以後我就可以填滿結構成員):

create_population(&popn, &parameters); 

感謝您的幫助。

+0

爲什麼'struct good ** goodsdistn'而不是'struct good * goodsdistn'? – trojanfoe

+0

@trojanfoe'goodsdistn'將是'struct good pointers'的數組。但我會進一步思考這個問題。 – Curious2learn

回答

1

正如評論我也相信,一個struct good **是矯枉過正所提到的,但是你知道嗎,你可以在變量使用sizeof

void create_population(struct population *popn, struct params *parameters) 
{ 
    popn -> ids = malloc(sizeof(popn->ids[0]) * parameters -> numpeople); 
    popn -> incomes = malloc(sizeof(popn->incomes[0]) * parameters -> numpeople); 
    popn -> goodsdistn = malloc(sizeof(popn->goodsdistn[0]) * parameters -> numpeople); 

} 

如果你確實想使用類型標識符,那麼你可以使用sizeof(struct good *)或通用sizeof(void *)。所有數據指針在C中具有相同的大小。

+0

謝謝。但是當'popn'被初始化時,當'ids','incomes'等等數組中沒有任何東西時,它會工作。也就是說,ids [0]是否有意義。我會研究struct good **的需求。 – Curious2learn

+0

@ Curious2learn是的,它會工作。你實際上不是取消引用指針,而只是查詢取消引用類型的大小。 'sizeof'是一個編譯器操作符,而不是一個運行時函數。 –

+0

謝謝。這很棒。我會試試這個,然後接受答案。再次感謝。 – Curious2learn

0

你想代替???如下:

malloc(sizeof(struct good *))