2017-10-19 63 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的名称,以便它不具有相同的名称作为外部变量)。