struct testcfg *pstCfg;
ulMsgLen = sizeof(*pstCfg) + (sizeof(pstCfg->astBaseCfg[0]) * (TYPE_NUM_MAX - 1));
pstSynTypeCfg = (struct testcfg *)calloc(1, ulMsgLen);

今天同事在帮忙review代码指出,上述代码存在访问空指针的问题。咋一看我也吓了一跳,但是这段代码明明可以正常运行啊,于是上网探索答案,结论如下:


当sizeof作用于表达式时,这个表达式将会在编译时进行分析,已确定它的类型,但这个表达式不会被求值。这就是为什么上面那段代码可以被正确执行的原因,因为sizeof(*pstCfg)并没对指针进行解引用,而是确定了指针所指向的类型。


扩展


#define member_size(type, member) sizeof(((type *)0)->member)

可以在不定义结构体变量的情况下计算结构体成员的大小。


x = sizeof(pstCfg); // x的值为在32位操作系统下为4,在64位操作系统下为8,聪明的大家一定已经明白了,sizeof (pointer)返回的时指针变量的长度
x = sizeof(*pstCfg); // x的值为struct testcfg的大小,sizeof(*pointer)返回指针类型的大小