在将函数作为参数传递后,在函数中访问指针指针的元素会导致程序崩溃。
例如
INITIALIZATION:
edge **graph;
graph = malloc(e*sizeof(edge));
for(int i = 0; i< e;i++){
graph[i] = malloc(sizeof(edge));
}
初始化后,这有效:
printf("%d\n", graph[i]->cost);
但是在将它传递给一个函数之后它会崩溃:
Function(edge **graph){
//stuff
printf("%d\n", graph[i]->cost); //this causes a crash
}
造成这种情况的原因是什么?提前致谢! :d
答案 0 :(得分:1)
graph[i]
的类型为edge *
(即指向edge
的指针)。
一般来说,malloc()
应该用于分配指向的大小的倍数。 graph
的类型为edge **
。这意味着提供给malloc()
的大小应该是edge *
大小的倍数。您的代码正在分配sizeof(edge)
的倍数(除非您很幸运)不等于sizeof(edge *)
。
因此,您的malloc()
来电应该看起来像graph = malloc(e * sizeof(edge *))
或者更好(因为它可以解决graph
指出的问题,而不必抓挠你的头脑)graph = malloc(e * sizeof(*graph))
。
如果你不这样做,使用解除引用graph
的结果(例如graph[i]->cost
会给出未定义的行为。避免未定义的行为是你需要确保(除其他外)之外的原因使用malloc()
分配的大小是有效的。未定义行为的一个症状是在某些情况下崩溃但在其他情况下不会崩溃 - 例如您在不同的上下文中看到相同的代码执行不同的操作。