C语言sizeof

sizeof,顾名思义,是描述一个数据类型的size的,也就是大小

简单地说,其作用就是返回一个对象或者类型所占的内存字节数。开始我还以为它是简简单单的一个函数而已,在了解后才发现,它的学问多着呢!

首先,sizeof有三种语法形式,分别如下:

  1. sizeof( object ); // sizeof( 对象 );

  2. sizeof( type_name ); // sizeof( 类型 );

  3. sizeof object; // sizeof 对象;

也就是说,不能写成sizeof int;形式

实际上,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的不同对象其sizeof值都是一致的。

这里,对象可以进一步延伸至表达式,即sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式进行计算。如:

sizeof(2);由于2是int数据类型,所以也相当于sizeof(int);

再比如sizeof(2+2.11);由于2.11是double数据类型,所以也相当sizeof(double);

sizeof也可以对一个函数调用求值,其结果就是函数返回数据类型的大小,这里就不做例子了。

下面我们再来看一下基本数据类型的sizeof:

32位操作系统里

char:1个字节 short int:2个字节

int:4个字节 unsigned int:4个字节

float:4个字节 double:8个字节

long:4个字节 unsigned long:4个字节

long long:8个字节 *:4个字节

64位操作系统里

char:1个字节 short int:2个字节

int:4个字节 unsigned int:4个字节

float:4个字节 double:8个字节

long:8个字节 unsigned long:8个字节

long long:8个字节 *:8个字节

数组的sizeof

数组的sizeof等于数组所占用的内存字节数,如:

char a1[]=“abc”; 那么sizeof(a1)为4。因为

字符串结尾还有一个NULL终止符

int a2[3];那么结果sizeof(a2)为3*4为12,因为

一个int的sizeof是4

结构体的sizeof

终于到了重头戏啦!虽然恶补两天还是没看懂,但是还是得贴出来呀!太重要太难了!
在这里插入图片描述
那么,sizeof(S1)等于多少呢?

char占1个字节,int占4个字节,那么加起来就应该是5,对吗?

emmmm不对!不要灰心,我们好好琢磨下sizeof定义:对象或者数据类型占的内存字节数。

观察S1的内存,S1的地址为0x0012FF78,其数据内容如下:

0012FF78:61 CC CC CC FF FF FF FF

为什么中间会插入3个CC呢?

这就是传说中的字节对齐!

计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,以此类推。这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。

在上面的例子中,char占1位字节,但是该结构体最宽的字节数是int,占四个字节,所以宽度为1的char需自动补全到4的倍数上,所以最后sizeof(S1)就为8。

怎么样,这还是最基础的结构体的sizeof呢!还有更复杂的结构体的sizeof需要我们去讨论和研究,但是基于我还没弄明白!所以接下来的学习任务就要我们一起去学习探讨哦!

发布了282 篇原创文章 · 获赞 4 · 访问量 5536

猜你喜欢

转载自blog.csdn.net/it_xiangqiang/article/details/105233495