【问题标题】:Question regarding memory allocation of variables in a structure (In C) [duplicate]关于结构中变量的内存分配的问题(在 C 中)[重复]
【发布时间】:2011-04-29 18:35:02
【问题描述】:

可能重复:
Why isn't sizeof for a struct equal to the sum of sizeof of each member?

#include <stdio.h>

int main(){

struct word1{
 char a;
 int b;
 char c;
};

struct word2{
 char a;
 char b;
 int c;
};

printf("%d\t%d\n", sizeof(int), sizeof(char));   //Output : 4 1
printf("%d\t%d\n", sizeof(struct word1), sizeof(struct word2)); //Output: 12 8
return 0;
}

代码可在IDEONE获取。

为什么 struct 1 (word1) 的 size 大于 struct 2 (word2) 的 size?

这是编译器问题吗?

【问题讨论】:

  • 不要使用 'void main()' 并期望不会大喊大叫 - main() 的正确返回类型是 int
  • 有一天有人会声称返回 void 而不是 int 会导致核熔毁或其他原因。
  • 好的,下次我会处理这个的。
  • @Crashworks:也许,但不是我。这意味着没有可靠的值返回给环境,所以如果程序 A 依赖于程序 B 的退出状态,那么如果 B 没有返回值,A 将从 B 收到什么值是不确定的。现在,如果这些程序靠近核电站,人们会假设代码审查、测试和编码标准都确保不会发生灾难。如果初学者学会从 main() 中返回一个值,这有助于他们准备好在比课堂练习更苛刻的环境中工作。最终,他们应该阅读 C 标准,但还没有。
  • 一定是 Stack Overflow 上重复最多的主题问题之一。

标签: c struct structure


【解决方案1】:

int 可能有四字节对齐要求,因此在第一种情况下,char 两个元素都需要附加三个填充字节,但在第二种情况下,您只需要两个填充字节第二个char 元素(因为char 元素有一个字节对齐)。

word1 看起来像:

0   |1   |2   |3   |4   |5   |6   |7   |8   |9   |10  |11
a   |  (padding)   |b                  |c   |  (padding)

word2 看起来像:

0   |1   |2   |3   |4   |5   |6   |7
a   |b   |(padding)|c               

【讨论】:

    【解决方案2】:

    案例一:

      0    1    2    3    4  
    +---------------------+
    | a    | Unused       |      4 bytes
    +---------------------+
    
      0    1    2    3    4 
    +---------------------+
    |       b             |      4 bytes
    +---------------------+
    
      0    1    2    3    4 
    +---------------------+ 
    | c    | Unused       |      4 bytes
    +---------------------+
    

    总数:12

    案例 2:

      0    1    2    3    4 
    +---------------------+
    | a   | b   | Unused  |      4 bytes
    +---------------------+
    
      0    1    2    3    4 
    +---------------------+
    |       c             |      4 bytes
    +---------------------+
    

    总数:8

    P.S : Structure Padding 是实现定义的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 2021-08-27
      • 2012-11-29
      • 2021-03-13
      • 2021-11-27
      相关资源
      最近更新 更多