2012-12-06 165 views
2

我有一個叫做course的結構體,每個課程都有多個節點(另一個struct'node')。malloc struct struct中的結構體數組

它具有的節點數量會有所不同,但我從正在讀取此信息的文件中獲得該編號,以便該編號位於變量中。

所以我需要一個malloc裏面的結構。但我很困惑。我知道你可以在結構中有數組,但我不知道在哪裏放置創建malloc數組的代碼,因爲我的結構在我的頭文件中。這是我目前的代碼。我意識到它看起來錯了,我只是不知道如何修復它,以及在哪裏初始化malloc數組。

struct course { 
    char identifier[2]; 
    int num_nodes; 
    struct node *nodes; 
    nodes = (struct nodes*)malloc(num_nodes*sizeof(struct node)); 
}; 

struct node { 
    int number; 
    char type[2]; 
}; 

我希望能夠做一些事情,如:

struct node a_node; 
struct course a_course; 

a_course.nodes[0] = a_node; 

等等

我沒有用太多C,這是第一一次,我曾經嘗試在C中使用動態數組。我的經驗都來自Java,當然Java並沒有像C那樣真正地使用指針,所以對我來說都有點混亂。

所以一些幫助,將不勝感激,非常感謝:)

+0

一種方法是像simonc在他的回答中描述的那樣做。我只想回答你將malloc調用放在哪裏的問題:在將內存分配給主結構之後立即執行它。僞代碼:'a = malloc(mother_struct); a-> baby = malloc(baby_struct);':-) – Jite

回答

6

最簡單的方法是創建初始化該結構的函數:

void init_course(struct course* c, const char* id, int num_nodes) 
{ 
    strncpy(c->identifier, id, sizeof(c->identifier)); 
    c->num_nodes = num_nodes; 
    c->nodes = calloc(num_nodes, sizeof(struct node)); 
} 

爲了對稱,你也可以再定義一個析構函數

void destroy_course(struct course* c) 
{ 
    free(c->nodes); 
} 

這些本來使用像

struct course c; 
init_course(&c, "AA", 5); 
/* do stuff with c */ 
destroy_course(&c); 
+0

請注意,使用示例將課程結構放置在堆棧上,而不是堆(如果是malloced)。我建議你清除'init_course'函數內部分配的內存。 – Jite

+0

@Jite對不起,我沒有關注。你的意思是'節點'成員應該清除內存嗎? – simonc

+0

是的,這是正確的。在你最初的解決方案中,你正在使用'malloc',但現在你使用'calloc',它爲你做了訣竅。 – Jite

3

malloc(或calloc--我更喜歡用於結構)的目的是在運行時動態分配內存。所以,你的結構應該是這樣的,因爲它是一個對象的定義:

struct course { 
    char identifier[2]; 
    int num_nodes; 
    struct node *nodes; 
}; 

別的地方在你的程序使用過程中結構,你將需要爲對象所創建的任何過程中分配內存(i)和(ii)該課程中的任何節點對象。

例如

main() 
{ 
    // lets say 1 course 
    struct course *my_course; 
    my_course = calloc(1, sizeof(struct course)); 

    // lets say 3 nodes in that course 
    struct node *my_nodes; 
    my_nodes = calloc(3, sizeof(struct node)); 

    my_course.num_nodes = 3; 
    my_course.nodes = my_nodes; 

    //... 
    // clean up 
    free(my_nodes); 
    free(my_course); 
} 

現在,你很好。確保在退出之前釋放內存。

+0

你犯了一個錯字:它應該是'struct course * my_course'。 – Jite

+0

修復它 - 鉭:) –

1

,也可以直接通過這種方式分配結構的結構:

首先聲明你的結構:

struct course { 
    char identifier[2]; 
    int num_nodes; 
    struct node *nodes; 
}; 

然後在你的程序

main(){ 
    int i; 
    struct course *c; 
    c = malloc(sizeof(struct course)); 
    c->num_nodes = 3; 
    c->nodes = malloc(sizeof(struct node)*c->num_nodes); 

    for(i=0; i<c->num_nodes; i++) 
     c->nodes[i] = malloc(sizeof(struct node)); 

    //and free them this way 
    for(i=0; i<c->num_nodes; i++) 
     free(c->nodes[i]); 
    free(c->nodes); 
    free(c); 


} 

或做它的方式以上任何你喜歡的東西

+0

這裏有幾個主要問題。 'nodes'是一個'node *',但是你根據不相關的'struct course'的大小來分配它。您稍後嘗試釋放'nodes'數組中的每個元素 - 由於數組本身已分配,這將失敗,而不是其各個元素。 – simonc

+0

是的你是正確的,我糾正它。 – Neo

+0

謝謝你,但你只應用其中的一個變化。你只需要調用'free(c-> nodes);' - 你仍然試圖釋放'c-> nodes'中的每個元素。 (一般來說,每個'malloc'都需要一個'free'',你的代碼目前有'malloc'',但'num_nodes'''''''' – simonc