2016-01-29 104 views
3

中的結構數組我一直在做研究一段時間,而且我沒有找到任何可以幫助我的東西。Malloc在結構體struct

我有以下結構聲明:

typedef struct position_struct{ 
    int x; 
    int y; 
} pos; 

typedef struct item_struct{ 
    char member1; 
    pos member2; 
} item; 

typedef struct room_stuct{ 
    item * member3; 
    pos * member4; 
    pos member5; 
} roomLayout; 

和代碼,試圖對malloc是(我刪除了錯誤檢查簡潔):

roomLayout *genFloor() { 
                 // Allocate mem for Arrays of: 
    roomLayout * room = malloc(sizeof(roomLayout) * 6); //  6 rooms 
    room->member3  = malloc(sizeof(item)  * 10); //  10 member3's 
    room->member4  = malloc(sizeof(pos)  * 10); //  10 member4's 

    /* TESTING */ 
    room[0].member3[0].member1 = 'd'; 
    printf("Room[0] is good\n"); 
    room[1].member3[0].member1 = 'd'; 
    printf("Room[1] is good\n");   // Never prints/makes it to this line 


    return room; 
} 

當我嘗試這一點,分配到房間[1]導致崩潰,但不是房間[0]。我的猜測是,我沒有真正爲整個陣列分配足夠的空間,只有一個點。但我不明白爲什麼,因爲我相信我遵循我在其他地方看到的。

如果有人可以向我解釋爲這種設置分配內存的過程,那將非常有幫助!謝謝。

+0

[靈活數組成員](https://en.wikipedia。org/wiki/Flexible_array_member)可能會讓你感興趣。 –

+0

停止將數組視爲指針。即使是指針,也不會爲數組分配內存。你分配一個內存塊,你使用一個指針指向那裏。請解釋一下你的「陣列」是如何指向那​​裏的? – Michi

回答

5

我們會根據第一room分配member3member4;不是爲了所有人。在行room->member3,room位於內存段的開始位置,或者在room[0]處,它爲10個member3分配空間。然而,room[1]沒有爲任何member3s分配任何空間(類似於門)。通過在一個循環中分配圍繞這一工作:

for(i = 0; i < 6; ++i) 
{ 
    room[i].member3 = malloc(sizeof(room[i].member3) * 10); 
    room[i].member4 = malloc(sizeof(room[i].member4) * 10); 
} 

free -ing的記憶,記得用類似的循環,即

for(i = 0; i < 6; ++i) 
{ 
    free(room[i].member3); 
    free(room[i].member4); 
} 

free(room); 
+0

這就是我想的,我只是不知道如何解決它。謝謝!我無法找到任何人在任何地方做循環! –

2
room->groundItems = malloc(sizeof(item) * 10); 

上面的代碼分配10項僅room[0]

room[1 to 5]未分配,訪問它們是UB

您必須分配所有的指針之前訪問它們,就像下面顯示

roomLayout * room = malloc(sizeof(roomLayout) * 6) 
for (int i=0; i<6; i++) 
{ 
    room[i].groundItems = malloc(sizeof(item) * 10); //  10 ground items 
    room[i].doors  = malloc(sizeof(pos) * 10); //  10 doors 
} 
1

您分配groundItemsdoors只對第一個房間,但你必須爲所有6個房間分配它。每個房間都需要自己的清單groundItemsdoors。適應你的代碼是這樣的:

roomLayout * room = malloc(sizeof(roomLayout) * 6); //  6 rooms 
for (int i = 0; i < 6; i ++) 
{ 
    room[i].groundItems = malloc(sizeof(item)  * 10); //  10 ground items 
    room[i].doors  = malloc(sizeof(pos)  * 10); //  10 doors 
} 

room->groundItems類似於room[0].groundItems。所以在你的情況下,room[0].groundItems[0].objectID工作,但room[1].groundItems[0].objectID失敗,因爲room[1].groundItems從未初始化。

0

您缺少分配給room[1]room[2]等等。 由 room->groundItems = malloc...你暗示地說 room[0].groundItems = malloc ...

也許配置六個地方的roomLayout讓你困惑。它分配指向groundItemsdoors數組的指針,但不是它們自己需要的空間。