【C语言】如何正确使用sizeof

26 篇文章 2 订阅
订阅专栏

sizeof用过吧?你肯定用过,至少你刚开始学C或者C++的时候,学到类型这一节,你一定会写如下代码测试每个类型的长度。

  printf("%d", sizeof(int));
  printf("%d", sizeof(char));
  printf("%d", sizeof(short));
  printf("%d", sizeof(long));
  printf("%d", sizeof(float));
  printf("%d", sizeof(double));

对,这就是sizeof的作用,它就是用来查询对象或类型的大小的。

下面详细说一下它的具体使用方式

测试环境:vs2015(win32 debug) win10-64

一、sizeof的具体使用

sizeof是用来查询对象或类型的大小,也就是说,查看某一个类型或对象它在内存中占几个字节。

它的使用方式有如下两种

sizeof(类型) 
sizeof 一元表达式

很多人看到sizeof后面的括号,就把sizeof当成是一个函数,事实上并不是,它是C语言中的一个运算符

具体使用的时候,sizeof后面是否需要有括号,那要看你测试的是类型,还是表达式。

举例,如果你测试的是类型的话,比如要测试int,char或者一个结构,那就必须要使用括号,例如

struct  sss
{
  int x;
  int y;
};
int main()
{
  printf("%d", sizeof(int));
  printf("%d", sizeof(struct sss));
  return 0;
}

结构也是一种类型,这样的就必须要套括号,如果不套,就会报语法错误

但是表达式不需要一定写括号,当然,也可以写括号,例如

 int a[] = { 1,2,3,4,5 };
  printf("%d\n", sizeof a);
  printf("%d\n", sizeof(a));

上面代码都可以,因为a不是类型,所以后面的括号,可写可不写

说到sizeof测试表达式,有一个地方需要注意,sizeof的优先级,在C的运算符中级别较高,
在这里插入图片描述
在这个级别中,结合方式是从右到左的方式,所以,以下代码

int c = 1;
int v = sizeof c+1 ;

最终v的值是5,而不是4,应为sizeof的运算优先级大于加号,所以,首先计算了sizeof c,然后又加了一个1,上述代码,相当于以下代码

int c = 1;
int v = sizeof(c)+1 ;

所以,你要想测试类似c+1,这种表达式,需要给他套括号,不过上述代码测试可能没有意义,c+1还是int,测试出来和c一样,还是4

有一点需要主要,sizeof是测试类型的,其他的不能测试,比如函数,void,都不行,但是void*,和函数指针可以,因为void*和函数指针都是指针类型,指针类型是可以测试的,代码如下

int main()
{
  int v = sizeof(void*) ;
  int(*fp)(int a);
  v = sizeof(fp);
  return 0;
}

返回的都是4

二、深入一下sizeof

上面已经说到,sizeof它不是个函数,只是个运算符,只是用了一个英文名字,没有用符号表示。既然不是函数,也就不存在运行时调用的问题,也就是说,sizeof的值,是在你运行编译程序时,就已经确认的,看以下代码,来说明这个问题

int main(int g)
{
  int c = 1;
  int v = sizeof(c)+g ;
  return 0;
}

因为c是个int所以,v的值应该是4+g的最终结果。看汇编代码
在这里插入图片描述
可以看到,g的值被存入了eax,然后把eax加了4,这个4就是sizeof©,测试出来的值。sizeof这个运算符根本没有参与程序运行相关的任何操作,程序在编译时就直接判断出sizeof的值是4

所以说,如果你要跨文件测试sizeof的话,有些类型,没法搞,例如,在不同文件中有

//b.c
#include <stdio.h>
int xxx[] = { 1,2,3,4,5 };
//a.c
int main()
{
  extern int xxx[];
  printf("%d\n", sizeof(xxx));
  return 0;
}

上述文件,不用编译,VS就直接提示错误了
在这里插入图片描述
这就是不完整类型,和不能测试VOID是一个道理,这就是最开始说的,sizeof在编译前就确定了要测试的类型大小,所以你测试的sizeof一定是要能确认的才行

再说一点,sizeof在用于测试数组或者结构的时候,会返回它实际的占用大小,例如

struct  sss
{
  int a;
  void* b;
};

int main()
{
  int a[] = { 1,2,3,4,5 };
  printf("%d\n", sizeof(a));
  printf("%d\n", sizeof(struct sss));
  return 0;
}

上述代码返回20,8

因为sss里,int和void*都是4,共占8,a是5个int,共占20

还有一点,看下列代码

void fun(int a[])
{
  printf("%d\n", sizeof(a));
}
int main()
{
  int a[] = { 1,2,3,4,5 };
  printf("%d\n", sizeof(a));
  fun(a);
  return 0;
}

上述代码会输出
在这里插入图片描述
不要奇怪,虽然看上去调用fun(a)的时候,是把a传入了fun中,但实际上,编译器并非传入了数组,而是传入了指向这个数组的指针int *a ,指针的长度就是4

上述代码相当于下面的代码

void fun(int * a)
{
  printf("%d\n", sizeof(a));
}
int main()
{
  int a[] = { 1,2,3,4,5 };
  fun(a);
  return 0;
}

再看一个

struct  sss
{
  int a;
  char b;
};

int main()
{

  printf("%d\n", sizeof(struct sss));
  return 0;
}

sss中,a是int 占4,b是char 占用1

但上面程序最终输出是:8

知道为什么吗?这是另一个问题,其实和sizeof本身没关系,以后会说

sizeof用法
qq_31604659的博客
01-21 5402
1.定义 sizeof是一个操作符(operator)。其作用是返回一个对象或类型所占的内存字节数。 2.语法 sizeof有三种语法形式: 1)sizeof (对象); 或sizeof 对象;//对对象的数据类型进行求值 2)sizeof (表达式); //值为表达式的最终结果的数据类型的大小 3)sizeof (数据类型);//sizeof (类型) 各种数据类型在16位、32位和64位系统下所占字节差异简介 输出数据的类型,其格式符和意义...
C语言sizeof()的用法
weixin_34087301的博客
10-21 5408
只要参加软件研发的笔试(C/C++)几乎都会涉及到sizeof()的用法,我昨天也遇到了,有的也会,但是真正sizeof()的核心还是没有领会,今天上网,无聊中就看到了详细的sizeof()的阐述,现在分享给大家。 ------------sizeof---------------- sizeof 一般形式为:sizeof(object),也可以sizeof var_ch...
解析C语言中的sizeof
蝈蝈俊.net
01-12 3030
解析C语言中的sizeof(作者:方敏、吴鸣鸣 2001年01月08日 15:28)一、sizeof的概念   sizeofC语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof使用方法   1、用于数据类型   sizeof
C语言sizeof运算符技术详解
最新发布
极客代码
07-28 932
sizeof运算符也可以用于用户定义的数据类型,如结构体和联合体。对于结构体,sizeof返回的是整个结构体的大小,包括所有成员变量和可能的填充字节(padding)。char a;int b;double c;return 0;在这个例子中,结构体Example包含了一个char类型、一个int类型和一个double类型的成员。由于内存对齐的原因,结构体的大小可能不是成员大小的简单相加。在实际应用中,sizeof运算符可以帮助我们了解结构体在内存中的布局和对齐要求。
C语言中的sizeof用法
热门推荐
记事本
07-31 5万+
C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么。我以前也有用错的时候,现在写一写,也算是提醒一下自己吧。反正现在来看,还在搞sizeof是什么意思,怎么用正确,还是有点搞笑,都经常用的东西,没有理解透彻,就差的太远了。 第一  sizeof是什么   sizeofC语言的一种单目操作符,如C语言的其他操作符++、--等,sizeof操作符以字节形式给出了其操作数
关于sizeof运算符的详细解析
benny5609的专栏
09-30 1810
关于sizeof运算符的详细解析: Part I:最基本的概念与基本使用方法:sizeofC语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 1、用于数据类型   sizeof使用形式:sizeof(type)   数据类型必须用括号括住。如
c语言sizeof结构体,C语言中的sizeof用法
weixin_42099987的博客
05-19 3139
C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么。我以前也有用错的时候,现在写一写,也算是提醒一下自己吧。反正现在来看,还在搞sizeof是什么意思,怎么用正确,还是有点搞笑,都经常用的东西,没有理解透彻,就差的太远了。第一 sizeof是什么sizeofC语言的一种单目操作符,如C语言的其他操作符++、--等,sizeof操作符以字节形式给出了其操作数的存储大小。...
浅析C语言中的sizeof
09-05
C语言中,`sizeof`是一个非常重要的运算符,它用于获取类型或变量所占据的内存字节数。这个运算符的返回值类型是`size_t`,这个类型通常在`<stddef.h>`头文件...正确理解和使用`sizeof`是编写高效、可靠C程序的关键。
详细解析C语言中的sizeof.docx
11-29
C语言中,`sizeof`是一个非常重要的操作符,它用于获取任何数据类型或变量在内存中占用的字节数。下面将详细解释`sizeof`的各个方面。...理解和正确使用`sizeof`对于任何C语言开发者来说都至关重要。
详细解析C语言中的sizeof.pdf
11-29
sizeof(var_name),sizeof var_name 等都是正确形式。 三、sizeof 的结果 sizeof 操作符的结果类型是 size_t,它在头文件中 typedef 为 unsigned int 类型。该类型保证能容纳实现所建立的最大对象的字节大小。 ...
sizeof()解析(原)
weixin_30500105的博客
02-02 235
(一)基本概念 sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 (二)使用方法 1、用于数据类型 sizeof使用形式:sizeof(type) ,如sizeof(int) 2、用于变量 sizeof使用形式:sizeof(var_name)或sizeof v...
C中sizeof用法
my0919的博客
07-27 696
sizeof用法总结: 1、在C语言中,sizeof()是一个判断数据类型或者表达式长度的运算符,对 sizeof() 的处理都是在编译阶段进行。 2、基本数据类型的sizeof 这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型,由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注意,尽量不要在这方面给自己程序的移植造成...
C语言----C语言sizeof用法
redrose2100的博客
01-05 4万+
sizeof用法 sizeof是计算变量在内存的占空间的大小,单位是字节 (1)使用sizeof查看数据类型占空间大小 如下,可以查看C语言中各种基本数据类型的占用空间的大小 # include <stdio.h> # include <string.h> int main() { printf("sizeof(char): %d\n", sizeof(char)); printf("sizeof(short): %d\n", sizeof(short)); printf
C语言sizeof用法
秦无邪 | 技术博客
11-17 3462
最近好多公司来武汉招聘,我也参加了不少的笔试,虽然结果都不是很理想,但是也发现了自己很多的不足,先总结一下C语言sizeof的一些用法,因为基本上只要是笔试题目,都会有关于这个的用法   1.sizeof的名称叫做求字节操作符,形式很像一个函数,就是求某个类型或者对象的字节数 2.sizeof的返回值类型是size_t,它是一个unsigned int类型 2.char、signed c
C语言中的sizeof用法详解
shanweikezhang的博客
09-21 2万+
转载:http://blog.sina.com.cn/s/blog_62d3a73a0100li1e.html 一、sizeof的概念   sizeofC语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof使用方法   1、用于数据类型   sizeof使用形式:sizeof(type)   数据类型必须用括号括住。如siz
c语言sizeof()的用法
内蒙肥羊的学习笔记
05-26 6563
#include <stdio.h> int main() { int a[]={1,2,3,4,5}; int b; b=sizeof(a)/sizeof(a[0]); printf("size %d",b); return 0; } sizeof()取出的是整个数组的内存位数,要知道元素个数,还要先计算出单个元素的内存位数。 ...
写文章

热门文章

  • 18个免费替代Photoshop的图像编辑软件 43753
  • 手机程序员常说的webview到底是个啥东西 25061
  • 一个简单的C++操作Excel的方案 23285
  • 自己去创建一个编程语言吧(1) 17693
  • C++真的能兼容C吗? 11766

分类专栏

  • 乱说一气 2篇
  • web开发 11篇
  • C++ 26篇
  • 自己去创建一个编程语言吧 7篇

最新评论

  • 用Cmake-js编译C++写的Nodejs扩展

    踏过山河,踏过海: 不是哥们,故意挖坑是把,a.cc少了头文件 #include <string>

  • 一个简单的C++操作Excel的方案

    weixin_41773229: 是只能处理xls文件吗,xlsx我生成就打不开了,报文件扩展名错误

  • 一个简单的C++操作Excel的方案

    不要当程序员: http://www.codeproject.com/KB/office/BasicExcel.aspx

  • 自己去创建一个编程语言吧(1)

    2401_82382763: https://docs.microsoft.com/zh-cn/previous-versions/618ayhy6%28v=vs.120%29

  • 一个简单的C++操作Excel的方案

    babywade1: 不知道,我已经确定是因为我的WPS产生的问题了。本来好的文件用WPS打开后保存修改也会不行表情包

最新文章

  • 【C++】使用自定义字面量,少写几句代码
  • 【C++】虚函数、虚基类、纯虚函数、抽象类到底怎么回事
  • 【C++】变参函数va_start,va_arg,va_end介绍及实现方式
2024年2篇
2023年6篇
2022年12篇
2021年11篇
2019年9篇
2018年3篇

目录

目录

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

天下网标王扶余网站优化大型网站优化的公司网站建设优化推荐k火11星优化网站方法咨询h火27星华强北在线网站优化莆田外贸仿牌网站优化比较好企业网站改版优化方案珠海市网站seo优化排名从化公司网站优化推广平台网站优化重要性扬州网站目标关键词优化合肥肥西网站优化长沙靠谱的服装行业网站优化海口seo外包优化网站广东网站优化建设选哪家嘉兴网站优化公司吴桥县网站优化包头网站seo优化温州市网站seo优化排名广州代办排名优化网站哪个公司强优化网站有明火15星精湛笋岗付费网站优化新乡官网网站优化公司寮步服装网站优化推广龙岩网站seo优化服务滦县专业的网站优化有哪些美容行业网站优化方案网站优化的三个基本思想湘潭网站优化怎么做河南seo网站优化推荐香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网标王 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化