为什么我需要创建一个结构然后指向它的地址的指针?
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
是这种情况下的有效内存。
我在 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
是这种情况下的有效内存。