#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 75 还有一点要注意,“空 ”(不含 )的大小不为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 输出的大小是从里面的参数类型最大的一个,返回大小