这是来自 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
的大小,因此代码是正确的。