正文
大家好,我是bug菌!
1
sizeof(变量)
很早之前跟大家聊过在编程过程中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,这样的指针对于隐藏数据类型是非常有用的。
所以你稍不留神就有可能写成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进阶专辑
☞ “bug说”专辑
☞ 专辑|手撕C语言
☞ 专辑|经验分享