int main(){
struct Map map;
readInMap(&map);
return 0;
}
void readInMap(struct Map * map){
//do stuff
}
所以,当我将地图地址作为参数发送时,我冒着某种内存分配错误的风险?我无法找到与此相关的任何问题,因为我缺乏关于我正在做的事情的一些词汇。我也研究过memallocation,并且喜欢个人参考某些与指针相关的解释。我从未在课堂上学到这一点
谢谢
编辑:我试图找出最有效的内存方式来执行我要执行的文件的操作。我在c中滥用指针,发现其他线程与其他相关信息,以帮助我解决我所要求的问题,如valgrind
答案 0 :(得分:3)
没关系,你把地图的地址(你在堆栈上创建的)传递给readInMap
函数。
struct Map map;
行正在为您(在堆栈上)分配内存,因此您有一个有效的struct
来获取地址。
答案 1 :(得分:1)
您传递自动在堆栈中分配的变量的地址。这样做不会给错误记忆带来风险。
答案 2 :(得分:0)
你的代码很好。始终复制函数参数,因此原始变量可以保持不变。基本上在您的函数中,您将拥有一个名为struct Map* map
的局部变量,它是指向地址的指针。当您使用readInMap(&map);
调用它时,您将地图的地址复制到该局部变量struct Map* map
,该变量仅存在于readInMap
函数中。
您没有冒任何内存分配错误的风险。你不必初始化任何东西,因为你只有一个指针而且它就是它。
对于代码优化,这实际上是将结构作为参数传递的最佳方式,因为您只复制地址而不是整个结构。让我们看另一个例子:
typedef struct Node {
char string[100];
int variable1;
int array[50];
} node;
如果用void readInMap(node map)
声明函数,当你实际从main调用这个函数时(作为函数参数,你给出结构变量,而不是指向结构的指针),函数readInMap会发生什么?正如我之前所说,scienes背后发生的是:函数将创建它自己的node map
变量并复制您传递给该局部变量的参数中的所有值。所以在我写的这个结构中,它必须复制数组和变量,而这根本就没有优化。
所以你可以像你一样用void readInMap(struct Map * map)
声明函数来解决这个问题。现在只复制地址,而不是整个结构,这是使用结构时的最佳优化。