2012-04-05 52 views
1

我正在努力通過學習C的艱難之路,我難倒了一些東西。我寫我遇到了這個問題的一個簡化版本,使其更容易獲得到它:爲什麼訪問一個mableced結構數組的成員seg錯誤?

#include <stdlib.h> 

#define GROUP_SIZE 10 
#define DATA_SIZE 64 

struct Dummy { 
    char *name; 
}; 

struct Group { 
    struct Dummy **dummies; 
}; 

int main() { 
    struct Group *group1 = malloc(sizeof(struct Group)); 
    group1->dummies = malloc(sizeof(struct Dummy) * GROUP_SIZE); 
    struct Dummy *dummy1 = group1->dummies[3]; 

    // Why does this seg fault? 
    dummy1->name = (char *) malloc(DATA_SIZE); 

    return 0; 
} 

當我嘗試設置名稱指針在我的假人我得到了賽格故障之一。使用valgrind它告訴我這是未初始化的空間。爲什麼是這樣?

回答

4

使用dummies似乎與其聲明不一致。從你的方式使用它看起來dummies的目的是爲陣列Dummy結構,而不是一個陣列陣列Dummy結構dummies領域。如果是這樣的話,你的宣言改成這樣:

struct Group { 
    struct Dummy *dummies; // Single asterisk 
}; 

然後改變您的使用情況如下:

struct Dummy *dummy1 = &group1->dummies[3]; 

當然這個假設GROUP_SIZE是四個或更多。

2

您從來沒有爲Dummy本身配置空間。你需要做的是這樣的:

group1->dummies = malloc(sizeof(Dummy *) * GROUP_SIZE); 
for(int i = 0; i < GROUP_SIZE; i++) { 
    group1->dummies[i] = malloc(sizeof(struct Dummy)); 
} 
+0

我會說@ dasblinkenlight的建議(使這個連續分配'struct Dummy's而不是雙重間接)可能會更好。 (除非你想做一些雙重間接實際上會有好處的事情) – asveikau 2012-04-05 17:33:41

+0

@asveikau我的回答是基於他在他的'struct'中有一個'Dummy ** dummies'的事實,並且假設有一個原因。 – twain249 2012-04-05 17:35:07

+0

所以你開始假設提問者明白爲什麼最好使用雙重間接,但*不*爲什麼當它被分配好像是連續分配時崩潰...... :-)我的提問者可能是新的,最好引入良好的實踐,而不是向他們展示如何在C中實現Java風格的內存佈局。@ – asveikau 2012-04-05 17:40:27

相關問題