#include<stdio.h>
structs1
{
charch;
intb2;
}s2;
structs3
charc1;
structs1s;
charc2;
}s4;
intmain()
inta;
intxh[4];
printf("%d\n",sizeof(a));
printf("%d\n",sizeofa);
printf("%d\n",sizeof(int));
printf("%d\n",sizeofxh);
printf("%d\n",sizeofs2);
printf("%d\n",sizeofs4);
return0;
}
输出:44416816
第一sizeof不是函数,
1、c语言中没有可接受参数为类型的函数,
2、没有哪一个函数可以没有括号的接收参数
而书中的归纳有:
1、sizeof是运算符,可用于任何变量名、类型名或常量值,当用于变量名(不是数组名)或常量时,它不需要用圆括号。
2、它在编译时起作用,而不是运行时。
3、注意结构体中的字节填充,字节的填充规则有:
1)结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internaladding);
3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailingpadding)。
#pragmapack的基本用法为:#pragmapack(n),
n为字节对齐数,其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么如果设为1的话,应该是完全符合了
该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值,假定设置1字节对齐,那么完全符合计算结果
例如:
#pragmapack(1)
charch;
charc1;
structs1s;
4441657
5还有一点要注意,“空结构体”(不含数据成员)的大小不为0,而是1。试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。//有的编译器不通过,不允许定义空结构体,codeblock实现的是0,是一个灰色地带,
6strlen:求有效长度,sizeof总体长度,
鉴于char*p="fddfgfdgfg";sizeof(p)=4;而指针指向的长度,可以用strlen()+1来获取长度,
char数组的有效长度,用strlen,大小用sizeof();
7sizeof接受参数的时候运行,参数不会计算,
i=0;
printf("%d\n",sizeof(i+++(++i)));
printf("%d\n",i);
输出0
输出的大小是从里面的参数类型最大的一个,返回大小