#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)
#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;
}
4
4
4
16
5
7
5
还有一点要注意,“空
”(不含
)的大小不为0,而是1。试想一个“不占空间”的
如何被取地址、两个不同的“空
”变量又如何得以区分呢于是,“空结构体”变量也得被
,这样
也就只能为其分配一个字节的空间用于占位了。
//有的编译器不通过,不允许定义空结构体,codeBlock实现的是0,是一个灰色地带,
6
strlen:求有效长度,
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
输出的大小是从里面的参数类型最大的一个,返回大小