This is actual C code from Pthreads:
ThreadParms *parms = NULL;
if ((parms = (ThreadParms *) malloc (sizeof (*parms))) == NULL)
{
goto FAIL0;
}
parms->tid = thread;
parms->start = start;
parms->arg = arg;
Why did they choose to malloc *parms instead of ThreadParms? It looks like it is allocating only a pointer (which would be an error), but it apparently allocating the size of the whole structure. Is this correct?
This is a common trick in C - using dereference pointer expression in place of the actual type.
The rationale is as follows: if you have
some_type *some_var = malloc(sizeof(*some_var));
and then change some_type to some_other_type, the code would continue working fine with only one change.
However, if you start with
some_type *some_var = malloc(sizeof(some_type));
then you have to change some_type in two places:
some_other_type *some_var = malloc(sizeof(some_other_type));
or your code would have an error.
It looks like it is allocating only a pointer (which would be an error)
The asterisk makes sizeof evaluate to the size of the entire struct, so the code is correct.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With