为什么我需要创建一个结构然后指向它的地址的指针?

Why do I need to create a struct and then a pointer to it's address?

我在 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

很明显,你需要创建一个包含“一堆整数和一个指向数据数组的指针”的结构类型的对象。

该对象将在某些功能中发生变化。要准确更改对象而不是函数中对象的副本,您需要通过引用将其传递给函数。

在 C 中,按引用传递意味着通过指向对象的指针间接传递对象。取消引用指针函数将直接访问传递的对象。

你可以编写调用函数的例子

some_function( &c );

但是你可以引入一个指针类型的中间变量,比如

comedi_cmd *cmd = &c;

并在函数调用中使用它而不是表达式 &c.

some_function( cmd );

让我们把这行分成两行:

comedi_cmd c;
comedi_cmd *cmd = &c;

第一行的作用是在堆栈上分配足够的内存以包含 comedi_cmd 类型的变量 c。那就是你的一堆整数和一个指针将存储在内存中的地方。

第二行定义cmd,一个指向comedi_cmd的指针,并用c的地址初始化它,这是存储整串整数和指针的地方在记忆中。

如果要定义 cmd 未初始化:

comedi_cmd *cmd;

那么它将有一个未定义的值(地址)。如您所见,取消引用它可能会导致 SIGSEGV。您必须确保 cmd 指向有效内存,并且 c 是这种情况下的有效内存。