首页 > 编程知识 正文

结构体数组大小,c语言结构体长度

时间:2023-05-03 07:24:00 阅读:162528 作者:1256

对于32位系统,运算符sizeof是sizeof(char )=1; 大小(int )=4。 因为基本数据类型的大小很容易计算,所以让我们来看看如何计算结构数据类型的大小。 C语言的结构数据类型有数组、结构体、共同体三种。 数组是同一类型的元素的集合,只要计算各个元素的大小,整个数组所占的空间就是基本元素的大小乘以元素数量。 结构的成员可以具有不同的数据类型,成员按定义的顺序依次存储在连续的内存区域中。 与数组不同,结构体的大小并不是所有成员的大小都简单地相加,存储结构体变量时需要考虑系统的地址排列。 请看以下结构。 struct stu1 { int i; char c; int j; (; 首先介绍相关的概念——偏移。 偏移是结构变量成员的地址与结构变量的地址之间的差。 结构的大小等于最后一个成员的偏移加上最后一个成员的大小。 很明显,结构变量的第一个成员的地址是结构变量的第一个地址。 因此,第一个成员I的偏移为0。 第二个成员c的偏移是第一个成员的偏移加上第一个成员的大小(0) 4,即4。 第三个成员j的偏移等于第二个成员的偏移加上第二个成员的大小(4),即5。 实际上,由于存储变量时的地址对齐要求,编译器在编译程序时遵循两个原则。 一个是结构变量的成员偏移量为成员大小的整数倍,两个是结构大小为所有成员大小的整数倍。

Arial; color:rgb(51,51,51); font-size:14.4444446563721px; line-height:25.9895839691162px"> 对照第一条,上面的例子中前两个成员的偏移量都满足要求,但第三个成员的偏移量为5,并不是自身(int)大小的整数倍。编译器在处理时会在第二个成员后面补上3个空字节,使得第三个成员的偏移量变成8。
对照第二条,结构体大小等于最后一个成员的偏移量加上其大小,上面的例子中计算出来的大小为12,满足要求。
再看一个满足第一条,不满足第二条的情况
struct stu2
          {
                int k;
                short t;
          };
成员k的偏移量为0;成员t的偏移量为4,都不需要调整。但计算出来的大小为6,显然不是成员k大小的整数倍。因此,编
译器会在成员t后面补上2个字节,使得结构体的大小变成8从而满足第二个要求。
由此可见,大家在定义结构体类型时需要考虑到字节对齐的情况,不同的顺序会影响到结构体的大小。对比下面两种定义顺序
struct stu3
          { 
                char c1; 
                int i;
                char c2;
          }
struct stu4
          {
                char c1;
                char c2;
                int i;
          }
虽然结构体stu3和stu4中成员都一样,但sizeof(struct stu3)的值为12而sizeof(struct stu4)的值为8。
如果结构体中的成员又是另外一种结构体类型时应该怎么计算呢?只需把其展开即可。但有一点需要注意,展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍。看下面的例子:
struct stu5
                {
                short i;
                struct 
                {
                   char c;
                   int j;
                } ss; 
                int k;
          }
结构体stu5的成员ss.c的偏移量应该是4,而不是2。整个结构体大小应该是16。
如何给结构体变量分配空间由编译器决定,以上情况针对的是Linux下的GCC。其他平台的C编译器可能会有不同的处理。

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