sizeof(变量)可不可以秀一点操作?


正文


大家好,我是bug菌!

1

sizeof(变量)

很早之前跟大家聊过在编程过程中sizeof需要注意的一些事情(容易掉坑) : 

【C进阶】拿着"sizeof这些用法和坑"去吹牛吧!

但是一直以来都强调sizeof(类型)的使用,却没有谈到sizeof(变量)的分析,sizeof(类型)是语法允许的,可能你觉得不会去写这样的代码,但是你能保证你的同事不会这么做吗?所以还是要注意区分:

先上个demo分析分析:

参考Demo:

 1#include <stdio.h> 
 2
 3/***********************************
 4 * Function: main
 5 * Author  : bug菌 
 6 * Description:主函数 
 7 **********************************/ 
 8int main(void)
 9{
10
11    char      cvar   = 0;
12    int       ivar   = 0;
13    double    fvar   = 0;
14    double *  pfVar  = &fvar;
15    void *    pvfVar = &fvar;
16
17    printf("sizeof(cvar)   = %d\n",sizeof(cvar)); 
18
19    printf("sizeof(ivar)   = %d\n",sizeof(ivar)); 
20
21    printf("sizeof(fvar)   = %d\n",sizeof(fvar));
22
23    printf("sizeof(pfVar)  = %d\n",sizeof(pfVar));
24
25    printf("sizeof(*pfVar) = %d\n",sizeof(*pfVar));
26
27    printf("sizeof(pvfVar) = %d\n",sizeof(pvfVar));
28
29    printf("sizeof(pvfVar) = %d\n",sizeof(*pvfVar));
30
31    printf("\n欢迎关注最后一个bug\n"); 
32    return 0;
33}

结果:(GCC环境下编译运行)

对于大部分朋友应该就最后一个拿不太准,你可能说:bug菌,谁会这么写呀~,没有啥意义;当然你说sizeof(void)意义不大我可以接受,因为一般也编译不通过。

不过对于sizeof(void*)或者sizeof(ptr)是可以输出所占据大小的,他们的输出与编译器有关,我这里使用的是32bit,输出为4个字节。

但是void *ptr,这样的指针对于隐藏数据类型是非常有用的。

【C进阶】同事用void把我给秀翻了!

所以你稍不留神就有可能写成sizeof(*pvfVar)的形式,然而所输出的字节个数并不是所指向的内存数据大小,在GCC中会输出1,而VC下大部分为0。

2

适用场景

上面看来sizeof里面放变量和放变量类型没啥区别,然而看一下如下操作:

参考Demo:

 1#include <stdio.h> 
 2#include <malloc.h> 
 3
 4
 5typedef struct _tag_ObjChild1
 6{
 7    char  Member1;
 8    int   Member2;
 9}sObjChild1;
10
11typedef struct _tag_ObjChild2
12{
13    char  Member3;
14    int   Member4;
15}sObjChild2;
16
17typedef struct _tag_ObjParent
18{
19    sObjChild1  sObjChild1;
20    sObjChild2  sObjChild2;
21}sObjParent;
22
23/***********************************
24 * Function: main
25 * Author  : bug菌 
26 * Description:主函数 
27 **********************************/ 
28int main(void)
29{
30    sObjParent *pObj;
31
32    pObj = (sObjParent *)malloc(sizeof(sObjParent) - sizeof(pObj->sObjChild2));
33
34    printf("malloc_addr : %p\n",pObj); 
35
36    printf("sizeof(sObjParent) - sizeof(pObj->sObjChild2) : %d\n",sizeof(sObjParent) - sizeof(pObj->sObjChild2)); 
37
38    printf("\n欢迎关注最后一个bug\n"); 
39    return 0;
40}

输出结果:

使用sizeof(变量)的方式在减少结构体成员所暂用空间方面还是比较方便的且更容易理解,如果结构体成员变量的类型经常会发生改变,那上面的编码形式改动是最少的。

你可能会问,使用变量会不会影响到程序的运行效率?

这是不会的,因为sizeof不管怎样它都是在程序编译期确定的,确定好以后就是一个无符号类型数值,与sizeof(类型)一样,有汇编为证~

最后

    好了,觉得有所收获,给个吧~~

推荐专辑  点击蓝色字体即可跳转

☞  MCU进阶专辑 

☞  嵌入式C语言进阶专辑 

☞  “bug说”专辑 

☞ 专辑|Linux应用程序编程大全

☞ 专辑|学点网络知识

☞ 专辑|手撕C语言

☞ 专辑|手撕C++语言

☞ 专辑|经验分享

☞ 专辑|电能控制技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值