2017-10-19 109 views
1

我有這樣的結構:結構設置等於隨機值

typedef struct Graph{ 
    node ** vertices; 
    int vertex_number; 
}Graph; 

我然後運行這個函數來創建一個圖表:

void init_graph(Graph *graph){ 
    graph = (Graph *) malloc(sizeof(Graph)); 
    graph->vertices = (node **) malloc(sizeof(node *)); 
    graph->vertex_number = 0; 
} 

而像這樣運行:

init_graph(&graph); 
printf("%d", graph.vertex_number); 

當我嘗試打印我創建的圖的vertex_number的值時,而不是給我零它給我一個像1356352456這樣的大數字,或類似的東西。爲什麼會發生這種情況,我該如何解決?

+0

你不改變指針*呼叫者*。另外,這不是[mcve]。如何聲明'graph'?一個結構 - 你已經分配了它!只要刪除'graph =(Graph *)malloc(sizeof(Graph));'它會工作... –

回答

0

(在init_graph)是一個函數參數。這意味着它是函數內的局部變量(包含參數的副本)。修改參數對函數的調用者沒有影響。

此外,(在main?)甚至不是指針。這是一個結構;它已經爲它分配了內存。如果您從init_graph中刪除graph = (Graph *) malloc(sizeof(Graph))行,則一切都應該起作用。


附註:您不應該cast the return value of malloc

0

你有這樣的功能:

void init_graph(Graph *g) 

和你與

init_graph(&graph) 

這意味着調用它,是你的本地指針變量g分配到的地址的值。 g是,並將始終是init_graph中的局部變量。你所做的就是將地址的值賦給函數外的變量。當您調用g=malloc(sizeof(Graph))時,您正在將g分配給一個全新的值,指向完全不同的存儲位置。

刪除該行,你應該沒問題。

(我脫離的鑄造爲墨爾波墨涅已經建議,我也改變了參數init_graph的名稱,以便它不具有相同的名稱作爲外部變量)。