【发布时间】:2022-01-20 21:02:17
【问题描述】:
我在 C 程序中使用 comedilib,我正在尝试理解这一行:
comedi_cmd c, *cmd = &c;
comedi_cmd 是一个结构,它包含一堆整数和一个指向数据数组的指针。变量c 不在其他任何地方使用。如果我省略创建 c 而只是这样做:
comedi_cmd *cmd;
...然后我开始遇到段错误。
为什么我们不能简单地创建指向comedi_cmd 结构的指针?这是一种分配内存的方式吗?
这是我不知道的 C 魔法吗?
有关更多上下文,comedilib 示例中有问题的行在这里:
https://github.com/Linux-Comedi/comedilib/blob/master/demo/tut3.c#L68
【问题讨论】:
-
这是因为它需要将它传递给需要指针的函数。 “为什么我们不能简单地创建指针”。你当然可以,这实际上就是
cmd。但是您仍然需要将其指向某些东西。如果您的意思是别的,请说明您想到的代码。 -
comedi_cmd *cmd;这只是创建了一个未初始化的指针。您需要先将其指向某物,然后才能使用它。否则它里面有一个垃圾值,而不是它需要的结构的有效地址。 -
我曾认为我使用
comedi_cmd类型的事实表明cmd应该指向代表结构的内存地址,但我可以看到他们没有跟进用 malloc 或任何东西。也许等效的初始化是:comedi_cmd *cmd = NULL; cmd = malloc(sizeof(comedi_cmd)); -
是的,这是另一种方法。但是,如果结构不需要保留在当前函数之外,那么完全按照所示使用局部结构变量会更简单且同样有效。在这两种情况下,
cmd最终都会指向一个有效的结构。 -
"cmd 应该指向一个代表结构的内存地址"。嗯,确实如此。这正是
cmd = &c所做的。为什么你认为它在那之后没有指向结构?