在Pthreads中使用malloc

Jim*_*ion 4 c malloc pointers sizeof

这是来自Pthreads的实际C代码:

ThreadParms *parms = NULL; 
if ((parms = (ThreadParms *) malloc (sizeof (*parms))) == NULL)
    {
      goto FAIL0;
    }

  parms->tid = thread;
  parms->start = start;
  parms->arg = arg;
Run Code Online (Sandbox Code Playgroud)

他们为什么选择malloc*parms而不是ThreadParms?看起来它只分配一个指针(这将是一个错误),但它显然分配了整个结构的大小.它是否正确?

das*_*ght 6

这是C中的常见技巧 - 使用解除引用指针表达式代替实际类型.

理由如下:如果有的话

some_type *some_var = malloc(sizeof(*some_var));
Run Code Online (Sandbox Code Playgroud)

然后更改some_typesome_other_type,代码将继续正常工作只有一个更改.

但是,如果你开始

some_type *some_var = malloc(sizeof(some_type));
Run Code Online (Sandbox Code Playgroud)

然后你必须改变some_type两个地方:

some_other_type *some_var = malloc(sizeof(some_other_type));
Run Code Online (Sandbox Code Playgroud)

或者你的代码会有错误.

看起来它只分配一个指针(这将是一个错误)

星号sizeof评估整个大小struct,因此代码是正确的.