C - 指针指针作为参数

时间:2015-11-19 10:04:18

标签: c function pointers segmentation-fault

在将函数作为参数传递后,在函数中访问指针指针的元素会导致程序崩溃。

例如

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

1 个答案:

答案 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()分配的大小是有效的。未定义行为的一个症状是在某些情况下崩溃但在其他情况下不会崩溃 - 例如您在不同的上下文中看到相同的代码执行不同的操作。