首页 > 编程知识 正文

结构体初始化为0,结构体输入5位同学

时间:2023-05-04 14:56:32 阅读:115959 作者:2082

文章清单1结构内存对齐2偏移3位段的计算

1结构内存对齐

结构内存对齐是一种在空间中改变时间的方法,计算机可以更快地接收内存中某个位置的数据,从而防止某些数据被二次访问。

首先,对结构体的排列规则进行说明。

1、成员变量必须对齐为“对齐数”的整数倍。 对齐数是编辑器的默认对齐数及其成员大小的较小值(对齐数为4 )。

2、整个结构的大小是该结构所有对齐数中最大的该对齐数的整数倍。

3、结构嵌套在结构中时,嵌套结构的对齐数是其最大的对齐数。

VS的默认对准数的值为8 Linux的默认值为4。

用代码展示:

结构S1 { char C1; int i; char c2; (; Sizeof(S1 )=12; 首先决定排列数。 c1的大小为1,因此根据第一个规则,对齐数为1,当前偏移为1,I的大小为4。 根据第一个规则,对齐数为4,所以必须在c1中填充3字节的空间。 当前偏移为4,以对齐I。 在偏移为4的位置加上I,当前偏移为8,偏移为8的位置加上1。 所以现在的偏移9。 此外,根据第二规则,整个结构的大小是该结构的所有对齐数中最大对齐数(4)的整数倍。 因此,偏移9之后将填充3字节的空间。 总大小为12字节。

结构S2 { char C1; char c2; int i; (; Sizeof(S2 )=8; 同样,由于c1、c2的排列数为1,所以到c2的偏移量为2,I的排列数为4,所以填充两个空间。 正在加4。 总大小为8字节。

结构S3 { double d; char c; int i; (; Sizeof(S3 )=16,8 )=16;

结构S4 { char C1; 结构S3 S3; //s3的对准数为8双精度d; (sizeof(S3 )=32,8168=32

可以使用命令#pragma更改缺省对齐数

#pragmapack(2) /设置默认对齐数为2structs1 ) charc1; //1 1=2 int i; //4 char c2; //1 1=2 } ); #pragma pack ()//取消设置默认的对齐数,恢复默认值时sizeof(s1 )=8

2要计算偏移,请使用系统默认宏offsetof获取每个成员的偏移

int main () printf ) ' %dn ',offsetof ) structS1,c1 ); printf(%d(n ),offsetof ) structS1,I ); printf(%d(n ),offsetof ) structS1,c2 ); }我们可以自己实现这个宏;

#defineoffsetof(s,m ) (size_t ) (s* )0)-m ) /偏移将减去该成员与结构地址的第一个成员,因此//将第一个成员的地址设置为

1、下级成员可以是int unsigned int signed int或char (属于整形家族)类型

2、比特段的空间上,根据需要以4字节(int )或1字节)进行开拓

3 .如果相邻位字段的类型相同,且位宽总和大于类型的sizeof大小,则后续字段将从新存储器单元偏移类型大小的整数倍。 (经过测试,此条似乎仅限于char类型,整数类型可以在域之间存储。)

4、相邻位域字段类型不同时,各编译器的具体实现方式有所不同,VC6采用未压缩方式,Dev-C采用压缩方式;

5、比特域字段之间插入非比特域字段时,不压缩;

6、结构整体总尺寸是最宽基本类型成员尺寸的整数倍。

计算偏移时,第一个成员认为偏移为0。

结构a { int _ a :2; //_a只占2比特的int _b:5; int _c:10; int _d:30; }2表示,可以先放弃一个int、_a、_b、_c,使其总计为17,_d=30。 无法放下。 要放弃另一个int,总共需要两个int。 所以sizeof(a )=8;

没有排队。

结构s { char a : 3; char b : 4; char c : 5; char d : 4; (; Sizeof(s )=3; 根据规则,可以先放置一个char、a和b,然后再放置一个char、c、另一个char和d。 所以一共需要三个字节。

牛客问题

结构a { unsigned a : 19; 无符号b : 11; 无符号c : 4; unsigned d : 29; char index; (; sizeof (结构)的值为16,

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。