首页 > 试题广场 >

下面C程序的输出结果是(windows 32位机) str

[单选题]
下面C程序的输出结果是(windows 32位机)
struct MyStruct
{
    int i;
    char c;
    struct InnerStruct
    {
        int i;
        long l;
        double d;
        char c;
    } innerStruct;
};
union MyUnion
{
    int i;
    char c;
};
int main()
{
   printf("%d, %d", sizeof(MyStruct), sizeof(MyUnion));
}
  • 28, 4
  • 28, 5
  • 32, 4
  • 32, 5
注意后面是联合体,联合体大小计算:直接等于里面最大的。

至于结构体大小的计算,。网上说法一大堆还都不一样分什么对齐不对齐,偏移量什么的。。
在此稍微举例总结下(本人java狗,欢迎指正):
// 对齐原则:每一成员的结束偏移量需对齐为后一成员类型的倍数
// 补齐原则:最终大小补齐为成员中最大值的倍数

以本题为例:【(开始偏移量)+此处字节 = 结束偏移量】
struct MyStruct
{
int i; // (0) + 4 = 4,后面一个为2,已经对齐,不用动
char c;  // (4) + 1 = 5,后面一个为结构体,直接拆开看第一个,int=4,所以对齐为(4) + 4 = 8
struct InnerStruct
{
int i;  // (8) + 4 = 12,下一个为4,已经对齐(学java注意了,32位下C语言的long为4,和java不一样)
long l;  // (12) + 4 = 16,下一个为8,已经对齐
double d;  // (16) + 8 = 24,下一个为1,已经对齐
char c;  //  (24) + 1 = 25,这是最后一个,将其对齐为最大值8的倍数,所以补齐为 (24) + 8 = 32,最后结果=32
} innerStruct;
};
union MyUnion
{
int i;  // 4
char c;  // 1
}; //  结果取最大 = 4
intmain()
{
printf("%d, %d", sizeof(MyStruct), sizeof(MyUnion));
}


【注意】如果指定对齐字节,则在对齐的时候将此指定与下一个的进行比较,取较小的那个进行对齐。
在补齐的时候,与最大的进行比较,也取较小的那一个进行补齐。

这是我写的相关博客,欢迎参考:http://www.cnblogs.com/Xieyang-blog/p/8724478.html
编辑于 2018-04-07 15:28:59 回复(2)
结构体大小等于最后一个成员的偏移量加上最后一个成员的大小
遵循两条原则:一、结构体变量中成员的偏移量必须是成员大小的整数倍; 二、结构体大小必须是所有成员大小的整数倍。

发表于 2018-03-23 14:51:37 回复(1)
一、结构体变量中成员的偏移量必须是该成员大小的整数倍(0被认为是任何数的整数倍) 。 
二、结构体大小必须是所有成员大小的整数倍。
三、如果结构体中的成员又是另外一种结构体,只需把其展开即可。但有一点需要注意,展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍。
发表于 2018-03-28 21:47:29 回复(0)
题目应该是认为long型占4字节
发表于 2018-05-12 14:18:17 回复(0)
// 结构体最终的size应该为成员里最大的整数倍
struct MyStruct
{
    int i; // 4 bytes
    char c; // 1 bytes
        char padding1[3]; // 3 bytes for alignment
    struct InnerStruct
    {
        int i; // 4 bytes
        long l; // 4 bytes
        double d; // 8 bytes
        char c; // 1 bytes
              char padding2[7]; // 7 bytes for alignment
    } innerStruct;
};

// 联合体size为成员里最大的那个

编辑于 2018-04-19 20:03:59 回复(2)
联合体直接以最大的计。
由于是32位机,所以每行4个字节。
struct MyStruct
{
    inti;//刚好一行,4Byte。第一行
    charc;//一行的第一个字节,1Byte。第二行
    struct InnerStruct
    {
        inti;//这里新起一行放置,刚好放满4Byte。如果接着第二行放置,前3Byte放置在第二行,后1Byte放置在第三行,这样取数需要两次。第三行
        longl;//刚好放两行。第四行和第五行。
        doubled;//刚好放两行。第六行和第七行。
        charc;//一行的前1Byte。但是所有题目好像在记的时候直接把它还是记为4Byte(32位机)
    } innerStruct;
};

发表于 2018-04-17 15:26:42 回复(0)