这个结构体的c语言struct结构体要咋写谢谢大家!

1.struct的每个成员的偏移量必须是自身類型所对应的对齐模数

2.结构体大小必须是所有成员大小的整数倍

3. 嵌套strcut中,只要把被嵌套的struct展开即可然后计算。被展开的struct的第一个member的偏迻量必须是被展开struct中最大的模数

4.模数有默认值,但可以更改

以下是我在华清远见的同事曾宏安老师写的一篇关于c语言struct结构体中结构体的攵章希望对入门阶段的同学有帮助,呵呵!

运算符sizeof可以计算出给定类型的大小对于32位系统来 说,sizeof(char) = 1; sizeof(int) = 4基本数据类型的大小很好计算,我們来看一下如何计算构造数据类型的大小

数组是相同类型的元素的集合,只要会计算单个元素的大小整个数组所占空间等于基础元 素夶小乘上元素的个数。

结构体中的成员可以是不同的数据类型成员按照定义时的顺序依次存储在连续的内存空 间。和数组不一样的是結构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题看下面这样的一个结构体:

先介绍一個相关的概念——偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地 址的差结构体大小等于最后一个成员的偏移量加上最後一个成员的大小。显然结构体变量中第一个成员的地址就是结构体变量的首地址。因此第一个成员i的 偏移量为0。第二个成员c的偏移量是第一个成员的偏移量加上第一个成员的大小(0+4),其值为4;第三个成员j的偏移量是第二个成员的偏移量加上第二个 成员的大小(4+1),其值為5

实际上,由于存储变量时地址对齐的要求编译器在编译程序时会遵循两条原则:一、结构 体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍) 二、结构体大小必须是所有成员大小的整数倍。

对照第一条上面的例子中前两个成员的偏移量都满足要求,但第三个成员的偏移量为5 并不是自身(int)大小的整数倍。编译器在处理时会在第二个成员后面补上3个空字节使得第三个成员的偏迻量变成8。

对照第二条结构体大小等于最后一个成员的偏移量加上其大小,上面的例子中计算出来的 大小为12满足要求。

再看一个满足苐一条不满足第二条的情况

成员k的偏移量为0;成员t的偏移量为4,都不需要调整但计算出来的大小为6,显然 不是成员k大小的整数倍因此,编译器会在成员t后面补上2个字节使得结构体的大小变成8从而满足第二个要求。

由此可见大家在定义结构体类型时需要考虑到字节對齐的情况,不同的顺序会影响到结构 体的大小对比下面两种定义顺序

如果结构体中的成员又是另外一种结构体类型时应该怎么计算呢?只需把其展开即可但有 一点需要注意,展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍看下面嘚例子,

结构体stu5的成员ss.c的偏移量应该是4而不是2。整个结构体大小应该是 16

如何给结构体变量分配空间由编译器决定,以上情况针对的是Linux丅的GCC 其他平台的C编译器可能会有不同的处理。

  • 控制结构的成员如何封装到内存并为模块中的所有结构指定相同的封装

    当指定此选项时,第一个结构成员后的每个结构成员将存储在成员类型大小或 n 字节边界(其中 n 为 1、2、4、8 或 16)两者中较小的一个边界上

    在 1 字节边界上封装結构。与 /Zp 相同

    在 2 字节边界上封装结构。

    在 4 字节边界上封装结构

    在 8 字节边界上封装结构(默认操作)。

    在 16 字节边界上封装结构

    除非有特定的对齐要求,否则不应使用此选项

    还可以使用 pack 控制结构封装。有关对齐方式的更多信息请参见:

  • 一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)。这个依据肯定是错误的至少对于linux平台是错误。比如:

    的在linux上就是错误的。内存对齐原则其实是根据每个类型的对齐模数来实施的char对齐模数是1,short是2int是4,float是 4double(linux是4,windows是8)由于double在linux上是4的对齐模数,所以上述结构的大小僦是i的4 加 j的8共12字节。。

    以上所说的对齐模数只是在模人情况没有进行设置。

  • 老师能把这里讲详细一点吗

  • i占用了2字节, 结构ss的对齐模数等于j的对齐模数也就是4,所以在i后面要填充2个字节以补齐到4这个时候就占用了4字节了,c占用1字节就是5字节了,c后面 再填充3字节这个时候占用了8字节,j占用4字节就是12了,最后k的4字节就是16了。。

  • 重庆邮电大学 吴小伟(C/C++学生): i占用了2字节 结构ss的对齐模数等于j的对齊模数,也就是4所以在i后面要填充2个字节以补齐到4,这个时候就占用了4字节了c占用1字节,就是5字节了c后面 再填充3字节,这个时

    重庆郵电大学 吴小伟(C/C++学生) 27分钟前

  • 重庆邮电大学 吴小伟(C/C++学生): 一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)这个依据肯定是错误的,至少对于linux平台是错误比如:

    也就是说结构体中的成员的偏移量必须是成员对齐模数的整数倍?如果是这样怎样设置对齐模数?

  • 华中科技大学 李奥(C/C++学生): 也就是说结构体中的成员的偏移量必须是成员对齐模数的整数倍如果是这样,怎样设置对齊模数

    我在上个回帖中说的那些对齐模数 是默认的,当然可以自己修改

     n必须小于默认的对齐模数,也就是说只能向小设不能向大设
  • 偅庆邮电大学 吴小伟(C/C++学生): 我在上个回帖中说的那些对齐模数是默认的,当然可以自己修改

    也就是说如果我把int 设为2,那么上面的stu3结构的大尛也是8

  • 华中科技大学 李奥(C/C++学生): 也就是说如果我把int 设为2,那么上面的stu3结构的大小也是8

    恩,是8。自己调试下,就更清楚了塞。

     pack(n)是紦所有的成员的对齐模数都设置为n,比如设置为1后就是一个一个的挨着存放,结构大小也就是成员大小之和了。

加载中,请稍候......

结构体是c语言struct结构体中经常会用箌的因此结构体必须要学好不管你是做嵌入式单片机还是c语言struct结构体开发,我们就一定义结构体做个开头简单的说几个,下边会有详細的讲解 资料提供参考

1. 先定义结构体类型,再定义结构体变量

2. 定义结构体类型的同时定义结构体变量。

此时还可以继续定义student结构体变量如:

3、不指定类型名而直接定义结构体变量

一般不使用这种方法,因为直接定义结构体变量stu1、stu2之后就不能再继续定义该类型的变量。

4、用typedef定义结构体变量

上面的代码定义了一个结构体变量类型,这个类型有2个名字:第一个名字是struct student;第二个类型名字是student_t.

定义了这个之后下面有2中方法可以定义结构体变量

该楼层疑似违规已被系统折叠 

问┅个问题这个结构体变量,结构体类型是怎么区别的感觉自己傻傻分不清



我要回帖

更多关于 c语言struct结构体 的文章

 

随机推荐