vlambda博客
学习文章列表

【C语言】你可能对 sizeof() 有点误解。。。

各位,今天还是按照惯例给大家分享一个C语言容易出现的小错误,这也是跟sizeof有关的,问题虽小,却可管中窥豹,话不多说,代码先行:

#include<stdio.h>int main(){  int i;  i = 8;     printf("%d\n",i);     printf("%d\n",sizeof(i++));      printf("%d\n",i);  return 0;}


问输出的值是什么?如果你上来就说8,4,9 那就错了。当然第一个是8没问题,第二个是4也没问题(32位int类型为4),主要错在了第三个数,其实本题着重考察的是我们对sizeof的理解。


首先我们要澄清一个误区:sizeof不是函数,不是函数,不是函数!重要的话说三遍,它是一个关键字,更准确地说它是一个单目运算符!其运算符的含义是:求出对象在计算机内存中所占用的字节数。根据C99的规范,sizeof是一个编译时刻就起效果的运算符,在其内的任何运算都没有意义,所以sizeof(i++)在编译的时候被翻译成sizeof((i++的数据类型)),也就是4(32位int),换言之编译时sizeof(i++)就被4取代了!因此当程序最终执行的时候,sizeof里面不会有任何的i++运算,所以i的值是不变的,这就是本题想考察的点了。


其次,我们注意一下,sizeof()和strlen之间的区别,请看以下代码:

#include<stdio.h>#include<string.h> int main(){   char word[] = "xuedinge" ;   printf(" %d ",strlen(word));  #8  printf(" %d ",sizeof(word)/sizeof(char));  #9;}


其实只是牵涉到字符串的存储问题:"xuedinge"字符串在存储的时候,存储为x u d i n g e \0,总共占用了9个内存单元,sizof()计算的时候会将\0计算在内,所以为9,strlen只是计算长度,不会把\0包括在内,所以为8,strlen为函数,sizeof为运算符


当然,关于sizeof还有其他许多用法和需要注意的地方,比如它的对象可以是表达式或者数据类型名,当对象是表达式时,括号可省略等等。。。同时sizeof在各种笔试面试中出现的几率非常高,希望大家对它进行熟练掌握,今天这里我们就不展开了,就到这里吧,感谢各位的耐心阅读。