2012-07-01 219 views
1

我正在創建一個帶有節點和邊的簡單圖。我得到了功能,但有一些內存錯誤。帶指針標記結構的malloc

我在頭文件中的typedef結構:

typedef struct Graph_s* Graph; 

並實現在C。文件:

struct Graph_s { 
    Node* nodeArray; 
    Edge* edgeArray; 
    size_t edges; 
    size_t nodes; 
}; 

和功能建設:

Graph create_graph() { 
    Graph newGraph = malloc(sizeof(Graph)); 

    newGraph->edges = 0; 
    newGraph->nodes = 0; 
    return newGraph; 
} 

Graph newGraph = malloc(sizeof(Graph))給出了:從Valgrind的Invalid write of size 8

+0

一些風格建議:不推薦使用'typedef's指針類型,'typedef's結構類型是不必要的。我只需聲明'struct Graph {...};'並將結構稱爲struct Graph,並將指針類型稱爲struct Graph *。因此:'struct Graph newGraph = malloc(sizeof * newGraph);'。而一個沒有參數的函數應該使用'(void)':'struct Graph create_Graph(void){...}' –

+0

感謝您的輸入!這有力地保持了事情的清晰。 – Jerry

回答

3

malloc(sizeof(Graph))只爲指針分配足夠的內存。將其更改爲malloc(sizeof(struct Graph_s))

+0

把它拉掉!謝謝佈雷特! – Jerry

+0

更好:'Graph newGraph = malloc(sizeof * newGraph);' –

+0

這是另一個例子,其中typedef的一切可以並且會使事情不那麼清楚,導致錯誤,因爲你甚至不能理解什麼你定義的類型是。 – tbert