首页 > 试题广场 >

在32位系统下下面程序输出的是?

[单选题]
在32位系统下下面程序输出的是?
#include<stdio.h>
union uni{
    int a;
    char b;
 };
struct str{
	int a;
    char b;
 };
int main(int argc, char **argv){
     printf("%d %d\n", sizeof(union uni), sizeof(struct str));
     return 0;
 }
  • 4 4
  • 4 8
  • 8 4
  • 8 8
gca头像 gca
B 4 8
union的大小取决于所占空间最大的变量的大小 并且是倍数  int a32位占4字节,所以uni的大小就是4字节
struct的大小由于内存对齐问题,int a四个字节,char b虽然是1个字节 但是为了存取效率,char b也被分配了一块4字节的空间,所以整个结构体所占空间为8字节
发表于 2015-03-28 20:57:34 回复(2)
题:struct st1{                                       struct st2{
          int i;                                                 char c;
          char c;                                             int i;
          short s;                                            short s;
       };                                                    };
       上述两结构体在内存中占用字节是多少,即sizeof(struct st1)=?, sizeof(struct st2)=?
解:8, 12
思考:这是struct结构的内存对齐问题,结构体的内存布局依赖于CPU、操作系统、编译器及编译时的对齐选项。其主要有:
1)结构体内部成员对齐
      对于结构体内部成员,通常会有这样的规定: 各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。 但是也可以看到,有时候某些字段如果严格按照大小紧密排列,根本无法达到这样的目的,因此有时候必须进行padding。各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调 整位置,空缺的字节编译器会自动填充也就是padding。如下图所示:
                   

      图中st1,第一个为int型,占用4个字节,第二个为char型,其偏移量为4,char所占的字节数为1,则偏移量是其占用字节数的倍数,则仅列其后,第三个为short型,占用字节数为2,前面已有字节为5,不是2的倍数,所以char后面padding一个字节,使得short的其实地址为6,所以对齐后,共占用8个字节。同理可得str2占用12个字节。
2)结构体之间对齐(此并不是考虑结构体内部的对齐,而是一组结构体的对齐,在计算单个结构体占用字节时并不考虑)
      虑整个结构体的对齐需求。ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。实际上要求结构体至少是其中的那个最大的元素大小的整数倍。因为有时候我们使用的是结构体数组,所以结构体的大小还得保证结构体数组中各个结构体满足对齐要求,同时独立的结构体与结构体数组中单个结构体的大小应当是一致的
编辑于 2015-08-27 14:35:05 回复(3)
Union表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的Union成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。
int 和 char在32位 下 size都是4
而Struct 是全部都存储的 所以大小为 4+4 =8
所以 答案B
发表于 2014-12-29 16:12:32 回复(0)
union取决于最大变量。 struct需要内存对齐。
发表于 2020-08-07 15:33:43 回复(0)
struct需要字节对齐
发表于 2015-09-07 16:03:15 回复(0)
union 取决于最大变量
struct 注意内存对齐
发表于 2015-08-27 19:51:17 回复(0)
union联合体的大小取决于里面内存空间最大的数据,这里是int类型所以为4个字节,而struct结构体会由于对齐,大小等于1+4+3=8
发表于 2021-08-24 10:57:44 回复(0)
union 取决于最大变量 struct 注意内存对齐
发表于 2022-07-08 07:16:43 回复(0)
union取成员类型最大字节作为整体大小,struct使用字节对齐方式,每个成员参与组成整体大小
发表于 2022-01-28 14:10:14 回复(0)
记住,union取成员类型最大字节作为整体大小;struct使用字节对齐方式,每个成员参与组成整体大小。
发表于 2020-12-29 08:25:03 回复(0)
联合union 的sizeof大小取决于最大变量
编辑于 2020-06-22 17:27:30 回复(0)