【技术短文】直到今天,我才真正理解sizeof()

今天写篇小短文,记录代码中有趣的知识点。

前面文章提到过,我目前在做基于AP标准someip协议栈的开发,而AP要求使用C++作为开发语言。由于公司开发的someip协议栈使用C语言,因而无法适用于AP。为了保证任务顺利完成当前首要目标是将现有的someip协议栈代码逻辑梳理清楚。

今天在梳理代码的过程中,看到了一行很有趣的代码。为防泄密,我将代码进行了修改,最后一行代码就是本文讨论的重点。

struct test
{
  int a;
}

sizeof((struct test*)0)->a;

最初看到这行代码,我以为是别人写就的bug。然而这个协议栈非常成熟,已经被多家OEM使用。如果有问题应该早就暴漏了才对,因此一定是我对于代码的理解有问题。对着代码思考了几分钟,毫无头绪。

我始终认为sizeof((struct test*)0)返回的应该是整型数字,为什么整型数字后面可以使用“->”运算符?

难道是我对sizeof()的理解有偏差,它还有其他用法?

上网搜索了sizeof的定义,读了下面这段话,一切疑惑烟消云散,果然是我对sizeof()的理解不够深刻。如果还不明白,请耐心听我细细道来。

【技术短文】直到今天,我才真正理解sizeof()

上图中“在C语言中,sizeof()是一个判断数据类型或者表达式长度的运算符”,这句话中的“运算符”就是最终的答案。

对!sizeof()不是函数,而是与“+”、“*”一样的运算符。

提到运算符,大家肯定会联想到运算符优先级,那么咱们回头看上面那行代码:

sizeof((struct test*)0)->a;

这行代码中有“()”、“->”、“sizeof()”三种运算符。优先级最高的当然是()运算符,->运算符优先级次之,sizeof()运算符优先级最低。

 

【技术短文】直到今天,我才真正理解sizeof()

我们可以将代码改为下面的形式,因此这行代码的目的是为了获取struct test中成员变量a的长度

sizeof(((struct test*)0)->a);

至此,所有的疑惑全部解开。今天的这个知识点虽小,但反映出两个问题:

1. 对于sizeof()的理解不够深刻,之前虽说会使用sizeof,但不知道是运算符

2. 这种编码方式会给增加代码阅读难度,在以后的编码过程中应引以为戒,尽量使用()划分优先级

作者:程序猿司晨
文章来源:上汽零束SOA开发者论坛 
原文链接:

上一篇:常用库函数


下一篇:数据结构(C语言)直接插入排序