关于内存对齐

#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
输出的大小是从里面的参数类型最大的一个,返回大小

你可能感兴趣的:(C语言,内存对齐)