首页 > 编程知识 正文

c语言结构体输入学生信息,c语言中%s和%c

时间:2023-05-06 12:50:31 阅读:115940 作者:2608

前言在c语言中,把变量放在内存中的位置有一定的规则,不是想放在哪里,而是比如常见的局部变量在堆栈区域,全局变量在全局区域等方式,今天我们讲的http://www.Sina .

文章前言结构内存对齐规则计算结构大小的示例为什么需要结构内存对齐使用默认对齐数为offsetof的结构内存对齐的规则结构的第一个成员变量地址和结构的起始地址偏移为0。 换言之,结构的第一个成员变量地址与结构的第一个地址相同。 第一个成员变量以外的成员变量必须将地址与结构体里面的成员变量呀,也是有一定的规则存放在内存中的,并不是我们所想那样,连续字节存放滴。的整数倍的地址对齐。对齐数:编译器的默认对齐数和成员变量大小的最小值。 min{默认对齐数,此成员变量的大小}。对齐数结构的总大小是每个成员对准数量中最大值的整数倍。 也就是说,如果结构大小=max{ (每个成员变量的对准计数)的整数倍,则嵌套结构的放置存储器地址必须是嵌套结构中每个成员的对准计数的最大值的整数倍。 结构体大小的计算示例

Linux没有默认字节对齐数,vs默认字节对齐数是8

计算以下两个结构的大小: 两个成员的变量相同,放置位置不同

# includestido.hstruct S1{char c1; int i; char c2; (; 结构S2 { char C1; char c2; int i; (; int main () printf('%d ',sizeof ) structS1 ); //12printf('%d ',sizeof ) structS2 ); //8返回0; }画画说明:

结构体S1

首先,根据字节对齐规则,第一个成员变量位于偏移0处,第一个成员是char类型,因此占用字节空间。 图的红色部分

* * * * * * * * * * * * * * * * * *

其次,根据规则2,我们知道第二个成员变量的对齐数为min { 8,4 }=4。 因此,必须找到4个对齐数的倍数的地址。 它从偏移量为4的位置开始,为int型,所以像蓝色的部分一样占4个字节。

* * * * * * * * * * * * * * * * * *

然后,根据规则2,我们知道第三个成员变量的对齐数为mim { 8,1 }=1。 因此,必须找到一个对齐数倍数的地址。 那个偏移量是9呢。 开始对齐数为1的地址直接添加在后面就可以了。

* * * * * * * * * * * * * * * * * *

最后,由于结构体的总大小=max{各成员变量的对准数}的整数倍,所以正题的3个成员变量的最大对准数为4,所以结构体大小为4的整数倍,但我们公布计算的大小为9,再加上3,最终

结构体S2

说明步骤与结构体S1相同

例题2 :

结构S3 { double d; char c; int i; (; printf(%d(n )、sizeof ) structS3 ); //结构体嵌套问题struct S4{char c1; 结构S3 S3; char c2; (; printf(%d(n )、sizeof ) structS4 ); 画画解释:

结构体3

画画儿说明

结构体4

首先,结构的第一个成员偏移为0,char类型,配置1个字节;

其次,第二个是嵌套结构。 放置在内存中的地址位置必须是嵌套结构中每个成员的最大对齐数的整数倍。 结构3的最大对齐数为8,因此配置位置必须从偏移量为8的地方开始配置。 结构体3的尺寸为16,因此配置16字节。

然后,将最后一个成员变量定位在偏移24处。

最后,整个结构的大小是结构S4的所有成员变量的对齐数最大的整数倍,S4的最大对齐数是8。 因为(包括计算结构3的最大对齐数),所以最终大小为32

为什么需要结构的内存对齐,至少还有混乱。 既然结构的成员变量应该直接放在下一个字节之后,为什么还要建立内存对齐概念,浪费一些空间呢?

其实这样设计是有一定的理由的。

1 .平台移植原因

并非所有硬件都可以访问任意内存地址的数据,因此根据平台的不同,可能只需对齐地址即可访问。

2 .提高性能

对齐字节可能会减少对同一成员变量的内存地址访问次数。

总的来说,消耗空间改变时间,提高性能。

我们要节约更多空间内容,只要尽量把空间集中得小一些就可以了。

如何自行设置默认对齐数?预处理指令#pragma允许您设置对齐数

具体而言,有以下例子。

# include stdio.h # pragma包

(8)//设置默认对齐数为8struct S1{char c1;int i;char c2;};//下面的一条语句要配合上面的 #pragma pack(8)#pragma pack()//取消设置的默认对齐数,还原为默认#pragma pack(1)//设置默认对齐数为1struct S2{char c1;int i;char c2;};#pragma pack()//取消设置的默认对齐数,还原为默认int main(){ //输出的结果是什么? printf("%dn", sizeof(struct S1)); //12 printf("%dn", sizeof(struct S2));//5 return 0;}

结论
结构在对齐方式不合适的时候,我么可以自己更改默认对齐数。

offsetof 的使用

offsetof是一个宏,可以计算出结构体中的某成员变量相对于结构体首地址的偏移量
具体使用方式:
offsetof(结构体类型,某成员变量) 返回的是一个整数,即偏移量;
头文件:#include<stddef.h>

#include<stddef.h>#include<stdio.h.h>struct S1{char c1;int i;char c2;};int main(){printf("%u ",offsetof(struct S1,c1)); //0printf("%u ",offsetof(struct S1,i));//4printf("%u ",offsetof(struct S1,c2));//8return 0;}

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