结构的大小
(前一部分可获得,后一部分应嵌入
该结构的解释不详细,可以使用
供参考)
运算符sizeof可以计算给定类型的大小. 对于32位系统,
sizeof(char)= 1; sizeof(int)= 4.
基本数据类型的大小易于计算,让我们看一下如何计算结构化数据类型的大小.
C语言中有三种类型的结构数据: 数组,结构和联合.
数组是相同类型元素的集合. 只要计算出单个元素的大小,整个数组所占用的空间就等于基数
将基本元素的大小乘以元素数.
结构中的成员可以是不同的数据类型,并且成员按照定义的顺序存储在连续的内存中
空格. 与数组不同,结构的大小不仅仅是所有成员大小的总和. 需要考虑的是系统在
存储结构变量时的地址对齐问题. 看一下这样的结构:
struct stu1
{
int i;
字符c;
int j;
};
首先介绍一个相关的概念偏移. 偏移量是指结构变量中成员的地址和结构更改
测量地址差. 结构的大小等于最后一个成员的偏移量加上最后一个成员的大小. 显然sizeof计算结构体大小,结构
body变量中第一个成员的地址是结构变量的第一个地址. 因此,第一个成员i的偏移量为0.
第二个成员c的偏移量是第一个成员的偏移量加上第一个成员的大小(0 + 4),其值为4;第一个
三个成员j的偏移量是第二个成员的偏移量加上第二个成员的大小(4 + 1),其值为5.
实际上,由于存储变量时地址对齐的要求,编译器在编译程序时将遵循两个原则:
1. 成员在结构变量中的偏移量必须是成员大小的整数倍(0被视为任何数字的整数倍)
2. 结构的大小必须是所有成员大小的整数倍.
与第一个成员相比,上例中前两个成员的偏移量满足要求,但第三个成员的偏移量为
5,不是其自身大小(int)的整数倍. 处理时,编译器将在第二个成员之后添加3个空字节,
使第三个成员的偏移量为8.
与第二个相比,该结构的大小等于最后一个成员的偏移量加上其大小,该大小在上例中计算得出
随附的大小为12,符合要求.
看一下满足第一项但不满足第二项的情况
struct stu2
{
int k;
短t;
};
成员k的偏移量为0;成员t的偏移为4,因此不需要进行任何调整. 但是计算出的大小为6,显示为
但是,它不是成员k大小的整数倍. 因此,编译器将在成员t之后添加2个字节,以使结构更大
小的变成8,以满足第二个要求.
可以看出,定义结构类型时需要考虑字节对齐,不同的顺序会影响
结构的大小. 比较以下两个定义序列
struct stu3 struct stu4
{{
char c1;字符c1;
int i;字符c2;
char c2; int i;
}}
尽管结构stu3和stu4的成员相同,但是sizeof(struct stu3)的值为12,sizeof(structstu4)的值
的值
是8.
如何计算结构中的成员是否为另一种结构类型?看下面的例子,
结构体温度
{
char a [5];
结构
{
int w;
双e;
int h;
} ss;
double d;
} tem;
只需扩展结构即可. 但是要注意的是,扩展结构的第一个成员(int w)
的偏移量
应该是要扩展的结构(ss所属的结构)中最大成员(双e)的整数倍.
解决方案如下:
第一个成员a [5]的偏移量为0. 第二个成员w的偏移量为第一个成员的偏移量加上第一个成员的偏移量
成员的大小(0 + 5),其值为5,不是(double e)大小的整数倍. 处理时,编译器将排在第三位
在
之后添加3个空字节
成员,以使第三成员的偏移变为8. 第三成员e的偏移为第二
该成员的偏移量加上第二个成员的大小(8 + 4),该值为12. 第四个成员h的偏移量是第三个成员
成员的偏移量加上第三个成员的大小(12 + 8),值为20. 第五个成员d的偏移量是第一个成员
四个成员的偏移量加上第四个成员的大小(20 + 8),其值为28,而不是其自身大小(双倍d)
的整数倍
. 处理时,编译器将在第二个成员之后添加4个空字节,以便第三个成员的偏移量
成为32. 结构的大小等于最后一个成员的偏移量加上它的大小,在上面的示例中更大
小为40,符合要求. 此时,请注意,尽管char a [5]是5个字符的类型,但结构的大小是在末尾计算的.
计算1,即最终结构的大小可以被1整除,然后传递. (紫色部分是我自己的摘要).
请注意,在Linux下sizeof计算结构体大小,整个结构的大小应为:
Char对齐模数为1,短为2,int为4,浮点数为4,两倍(Linux为4,windows为8)
因此,对于以下结构: (32位计算机,默认设置)
结构体温度
{
int i;
double j;
};
在WINDOWNS系统下,整个结构的大小应为16,在LINUX系统下,整个结构的大小
大小应为12
本文来自本站,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-287415-1.html
……