首页 > 试题广场 >

下面这段程序,描述正确的是( )#pragma pack(1

[单选题]
下面这段程序,描述正确的是( )
#pragma pack(1)
struct{
union{
int p1; union{ char p2; int p3; };
};
int p4;
char p5;
} a;
#pragma pack(0)
  • sizeof(a)为9,是在程序运行时计算完成
  • sizeof(a)为12
  • (void*)&(a.p1)==(void*)&(a.p2) 永远为真
  • a.p1==a.p4永远为真
要计算这个结构体a所占的字节大小,需要考虑 C 语言中的结构体对齐联合体 (union) 的特性

  1. 联合体 (union) 的特性:联合体中所有成员共享同一块内存空间,其大小等于最大成员的大小。
  2. 结构体对齐规则:结构体的总大小是其最大成员大小的整数倍,且每个成员要对齐到自身大小的整数倍地址上。

逐步分析:

从内到外分析结构:

  1. 最内层联合体
    c
    运行
    union{ char p2; int p3; }; 

    • p2是char类型(1 字节)
    • p3是int类型(通常 4 字节)
    • 该联合体大小 = 最大成员大小 = 4 字节
  2. 外层联合体
    c
    运行
    union{ int p1; // 4字节 内层联合体; // 4字节(见上) }; 

    • 两个成员都是 4 字节
    • 该联合体大小 = 4 字节
  3. 整个结构体
    c
    运行
    struct{ 外层联合体; // 4字节 int p4; // 4字节 char p5; // 1字节 }; 

    • 最大成员大小为 4 字节(int类型)
    • 总大小需要是 4 的整数倍,因此 1 字节的p5会占用 3 字节的填充空间
    • 总大小 = 4 + 4 + 1 + 3(填充)= 12 字节

结论:

在通常的 32 位或 64 位系统中(int为 4 字节),该结构体a所占字节大小为 12 字节

(注:如果系统中int为 8 字节,结果会不同,但现代系统中int通常为 4 字节)
发表于 2025-08-26 17:14:30 回复(0)