sizeof你真的弄明白了吗?来看看这个例子

本文 转自「 嵌入式大杂烩 」,喜欢的同学可以关注~

sizeof基础

在C语言中, sizeof是一个操作符(operator),而不是函数!其用于判断数据类型或者表达式长度(所占的内存字节数)。其有两种表达形式:
(1)sizeof(类型说明符)
(2)sizeof 表达式
我们通常使用第(1)种形式。
其返回值类型为size_t,在头文件 stddef.h中定义。这是一个依赖于编译系统的值,一般定义为:
typedef unsigned int size_t;
首先确定我们当前编译环境中C语言各个基本数据类型在内存中所占字节数,我这里是32bit编译环境:
 
  
#include <stdio.h>

int main(void)
{
printf( "sizeof(char) = %u\n", sizeof( char));
printf( "sizeof(short) = %u\n", sizeof( short));
printf( "sizeof(int) = %u\n", sizeof( int));
printf( "sizeof(long) = %u\n", sizeof( long));
printf( "sizeof(float) = %u\n", sizeof( float));
printf( "sizeof(double)= %u\n", sizeof( double));

return 0;
}
我们这里的输出结果为:
640?wx_fmt=png

sizeof典型问题

sizeof看起来似乎很简单,那来看看下面这段代码,你能做对几个 2_02.png
 
  
#include <stdio.h>

int main(void)
{
char *s = "hello";

printf( "sizeof(char) = %u\n", sizeof( char));
printf( "sizeof(char*)= %u\n", sizeof( char*));
printf( "sizeof('a') = %u\n", sizeof( 'a'));
printf( "sizeof(*s+0) = %u\n", sizeof(*s+ 0));
printf( "sizeof(*s) = %u\n", sizeof(*s));
printf( "sizeof(s) = %u\n", sizeof(s));

return 0;
}
实际输出结果为:
640?wx_fmt=png
你懵了吗?没懵的话算我输640
640?wx_fmt=gif
简要分析:
(1) sizeof(char) 的值为1。因为char类型数据在内存中占1字节。
(2) sizeof(char*)的值为4。因为char*代表一个指针,在32bit环境中为4字节,也即unsigned int的字节长度。
(3) sizeof('a')的值为4。因为此处‘a’是独立存在的一个字符(没有赋值给其它变量), 实际上就是一个整型数,占4个字节,即此处‘a’对应的ascii码的十进制 为整数97。(貌似解释得有些牵强,但事实就是这样640)但是需要注意的是, 若有如下定义:
char ch = 'a';
则此处ch的字节数sizeof(ch)的值为1,而不是4。
(4) sizeof(*s+0)的值为4,因为'h'+0 转化为int,占4字节。此处涉及到类型转换的问题。即不同类型的数据进行运算时,会首先转换成相同数据类型。转换规则为(图片来源于网络):
640?wx_fmt=jpeg


(5) sizeof(*s)的值为1,因为此处*s为字符串s的第1个字符‘h’(注意与第三点区分开来,这里是有用char来修饰的),所以所占字节长度为1。
(6) sizeof(s)的值为4,同(2),此处s是一个指针,在32bit环境中为4字节,也即unsigned int的字节长度。
End:以上就是本次的分享,如有错误,欢迎指出!欢迎转发、下载、收藏、点赞
﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌﹌
免责声明: 内容整理自网络,版权归原作者所有,如涉及作品版权问题,请及时与我们联系,谢谢!

往期好文合集

戳这里>>


//end
若觉得文章不错, 转发分享 ,也是我们继续更新的动力。
5T资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、单片机、等等

在公众号内回复「更多资源」,即可免费获取,期待你的关注~

640?wx_fmt=jpeg

长按识别图中二维码关注

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值