I'm working with comedilib
in a C program and I'm trying to understand this line:
comedi_cmd c, *cmd = &c;
comedi_cmd
is a struct which contains a bunch of integers and a pointer to a data array. The variable c
is not used anywhere else. If I omit creating c
and just do:
comedi_cmd *cmd;
...then I start getting segfaults.
Why can we not simply create the pointer to a comedi_cmd
struct? Is this a way of allocating memory?
Is this some C magic that I'm unaware of?
For more context, the line in question from the comedilib
examples is here:
https://github.com/Linux-Comedi/comedilib/blob/master/demo/tut3.c#L68
CodePudding user response:
It is evident that you need to create an object of the structure type that contains "a bunch of integers and a pointer to a data array".
This object will be changed in some functions. To change exactly the object and not a copy of the object within functions you need to pass it to functions by reference.
In C passing by reference means passing an object indirectly through a pointer to it. Dereferencing the pointer functions will have a direct access to the passed object.
You could write for example calling a function
some_function( &c );
However you can introduce an intermediate variable of a pointer type like
comedi_cmd *cmd = &c;
and use it in function calls instead of the expression &c
.
some_function( cmd );
CodePudding user response:
Let's split the line into two lines:
comedi_cmd c;
comedi_cmd *cmd = &c;
The first line has the effect of allocating enough memory on the stack to contain variable c
of type comedi_cmd
. That's where your bunch of integers and a pointer will be stored in memory.
The second line defines cmd
, a pointer to comedi_cmd
, and initializes it with the address of c
, which is where the the bunch of integers and a pointer are stored in memory.
If you were to define cmd
uninitialized:
comedi_cmd *cmd;
then it would have an undefined value (address). Dereferencing it would likely cause a SIGSEGV
, as you observed. You must make sure that cmd
points to valid memory, and c
is the valid memory in this case.