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

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

  parms->tid = thread;
  parms->start = start;
  parms->arg = arg;

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

最佳答案

这是 C 中的一个常见技巧——使用解引用指针表达式代替实际类型。

理由如下:如果你有

some_type *some_var = malloc(sizeof(*some_var));

然后将 some_type 更改为 some_other_type ,代码将继续正常工作,只需进行一项更改。

但是,如果您开始
some_type *some_var = malloc(sizeof(some_type));

那么你必须在两个地方更改 some_type:
some_other_type *some_var = malloc(sizeof(some_other_type));

否则您的代码会出错。



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

10-08 07:36