int main(){
struct Map map;
readInMap(&map);
return 0;
}
void readInMap(struct Map * map){
//do stuff
}
因此,当我将映射地址作为参数发送过来时,我是否有某种内存分配错误的风险?我找不到与此相关的任何问题,因为我缺乏一些关于我正在做的事情的词汇。我还研究了内存分配,并希望个人参考一些可以很好地解释它与指针相关的内容。我在课堂上从来没有学到过
谢谢
编辑:我试图找出对我要执行的文件执行操作的最节省内存的方法。我在 c 中滥用指针,并找到了其他具有其他相关信息的线程来帮助我解决我要求的问题,例如 valgrind
没关系,您将 map 的地址(您在堆栈上创建)传递给 readInMap
函数。
struct Map map;
行正在为您分配内存(在堆栈上),因此您有一个有效的struct
来获取其地址。
传递堆栈中自动分配的变量的地址。这样做不会冒错误内存的风险。
你的代码很好。函数参数总是被复制的,因此原始变量可以保持不变。基本上在你的函数中,你会有一个名为struct Map* map
的局部变量,它是指向地址的指针。当你用readInMap(&map);
调用它时,你将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)
声明函数即可解决此问题。现在只复制地址,而不是整个结构,这是使用结构时的最佳优化。