gpt4 book ai didi

C - 指针作为参数

转载 作者:行者123 更新时间:2023-11-30 15:14:59 24 4
gpt4 key购买 nike

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

例如

初始化:

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

最佳答案

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

关于C - 指针作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33800675/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com