首页 > 试题广场 >

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

[单选题]
在32位机上,下面C程序的输出结果是()
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
一般32位机子上各个数据类型所占的存储空间如下:

char:8位 

short:16位

int:32位

long:32位

float:32位

double:64位

一、接下来先来看struct,结构体

请牢记以下3条原则:(在没有#pragma pack宏的情况下)

1、数据成员对齐规则:结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,之后的每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机子上为4字节,所以要从4的整数倍地址开始存储)。

2、结构体作为成员:如果一个结构体里同时包含结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(如struct a里有struct b,b里有char,int ,double等元素,那么b应该从8(即double类型的大小)的整数倍开始存储)。

3、结构体的总大小:即sizeof的结果。在按之前的对齐原则计算出来的大小的基础上,必须还得是其内部最大成员的整数倍,不足的要补齐(如struct里最大为double,现在计算得到的已经是11,则总大小为16)。
  1. typedef struct bb
  2. {
  3.     int id; //[0]....[3] 表示4字节
  4.     double weight; //[8].....[15]      原则1
  5.     float height; //[16]..[19],总长要为8的整数倍,仅对齐之后总长为[0]~[19]为20,补齐[20]...[23]     原则3
  6. }BB;
      size为56

二、union共用体(联合)

共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。当一个共用体被声明时, 编译程序自动地产生一个变量, 其长度为联合中元类型(如数组,取其类型的数据长度)最大的变量长度的整数倍,且要大于等于其最大成员所占的存储空间。

union foo
{
char s[10];
int i;
}
在这个union中,foo的内存空间的长度为12,是int型的3倍,而并不是数组的长度10。若把int改为double,则foo的内存空间为16,是double型的两倍。

union   mm{  
  char   a;//元长度1        1
  int   b[5];//元长度4     20
  double   c;//元长度8     8
  int   d[3];              12
  };  

所以sizeof(mm)=8*3=24;












发表于 2018-08-13 15:36:27 回复(7)
做选择题就要有做选择题的方法,除了掌握基本的知识。
对于struct来说,大小虽然要慢慢累加,但是最后必然为struct里最长类型的整数倍,即double为8字节,则肯定是8的整数倍,排除A,B(不用慢慢累加计算)
对于Union来说,就简单了,大小为最长类型的整数倍,即int为4字节,则为4,选C
编辑于 2020-05-27 11:19:22 回复(2)
这道题的答案是错误的,32操纵系统的时候,结果是28,64的时候,结果未32,vs2010亲测
发表于 2020-03-12 18:22:48 回复(3)
灰色的块补位
发表于 2023-03-14 15:51:31 回复(0)
看清楚第一个是结构体里面还有一个结构体 要求的是大的结构体还要加上外面一个8字节
发表于 2022-07-22 18:33:57 回复(0)
我靠,没有看见union
发表于 2023-04-21 17:06:49 回复(0)
答案错了
发表于 2023-03-15 21:11:49 回复(0)
如果一个结构体里同时包含结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(如struct a里有struct b,b里有char,int ,double等元素,那么b应该从8(即double类型的大小)的整数倍开始存储)
发表于 2023-03-14 18:25:07 回复(0)
结构体长度并不一定是double的长度8的整数倍,而是min(字节对齐长度,8)的倍数
如果默认编译器4字节对齐,这题就是28,如果是8字节,就是32

设对齐字节数为n(n = 4或8,区别于32位或者64位操作系统),每个成员内存长度为Li, Max(Li)为最大的成员内存长度,字节对齐规则是:
1.       结构体对象的起始地址能够被Max(Li)所整除;
2.       结构体中每个成员相对于起始地址的偏移量,即对齐值应是min(n,Li)的倍数.若不满足对齐值的要求,编译器会在成员之间填充若干个字节;
3.       结构体的总长度值应是min(n,Max(Li))的倍数,若不满足总长度值的要求,编译器在为最后一个成员分配空间后,会在其后填充若干个字节.
发表于 2021-03-07 10:46:10 回复(1)
32位环境下,long是4字节,因此Sizeof(Inner Struct)=24,大的结构体大小为24+8=32
发表于 2021-11-16 22:08:21 回复(0)