【问题标题】:Do I need to allocate memory for a pointer I didn't explicitly define? [closed]我是否需要为没有明确定义的指针分配内存? [关闭]
【发布时间】:2016-05-07 10:22:44
【问题描述】:
int main(){
    struct Map map;
    readInMap(&map);
    return 0;
}
void readInMap(struct Map * map){
   //do stuff
}

所以当我将地​​图地址作为参数发送时,我是否会冒某种内存分配错误的风险?我找不到任何与此相关的问题,因为我缺乏一些关于我在做什么的词汇。我还研究了 memallocation 并且希望个人参考可以很好地解释与指针相关的内容。我从来没有在课堂上学过

谢谢

编辑:我试图找出对我要执行的文件执行操作的最节省内存的方法。我在 c 中滥用了指针,并找到了其他线程以及其他相关信息来帮助我解决我要求的问题,比如 valgrind

【问题讨论】:

  • 你没有为指针分配内存——你有一个指针。你为一个它指向的对象分配内存。说了这么多,现在自己想想:那个对象是什么,分配在哪里?

标签: c pointers gcc memory malloc


【解决方案1】:

没关系,您正在将 map 的地址(您在堆栈上创建)传递给 readInMap 函数。

struct Map map; 行正在为您分配内存(在堆栈上),因此您有一个有效的struct 来获取地址。

【讨论】:

  • 通过使用这种方法并将所有可能需要它的函数保存在一个文件中,我是最有效的吗?我想优化我的程序,该程序在一个文件中创建、读取并找到穿过迷宫的路径
  • 效率与你有多少源文件无关。首先专注于获得可行的解决方案。
【解决方案2】:

您传递在堆栈中自动分配的变量的地址。这样做不会有错误记忆的风险。

【讨论】:

  • OP 的代码分配内存。它通过定义struct Map map 在堆栈上执行此操作。这将如何回答 OP 的问题。
  • 我对这两个方面的了解已经足够多,这确实有助于我更广泛地理解事物。谢谢!
  • 据我了解,当有人谈论内存分配时,这意味着他“手动”执行(使用 malloc)。 OP 还说他缺乏词汇,这就是我指出堆/堆栈问题的原因。
  • 那么@SebSaletes,alloca 呢?根据您的定义,这将算作“手动”,但永远不会在堆上。
  • @DavidHoelzer 感谢您向我指出这一点!我从来不用这个功能。我应该删除还是编辑我的答案?
【解决方案3】:

您的代码很好。函数参数总是被复制,所以原始变量可以保持不变。基本上,在您的函数中,您将有一个名为 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) 声明函数来解决这个问题。现在只复制地址,而不是整个结构,这是使用结构时最好的优化。

【讨论】:

  • 谢谢你完美回答了我的问题
猜你喜欢
  • 2017-01-27
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多