视频加载失败

课程

4401 字
约 13 分钟

GPT

计算机系统基础exercises/Homework/RainClass/chapter03·更新于 2026-09-15
(1) struct S1

{

    short s;

    char c;

    int i;

    char d;

};

(2) struct S2

{

    int i;

    short s;

    char c;

    char d;

};

(3) struct S3

{

    char c;

    short s;

    int i;

    char d;

};

(4) struct S4

{

    short s[3];

    char c;

};

(5) struct S5

{

    char c[3];

    short *s;

    int i;

    char d;

    double e;

};

(6) struct S6

{

    struct S1 c[3];

    struct S2 *s;

    char d;

};

GPT

基本规则:

  1. 对齐规则:
    • 每个成员的地址必须是其类型大小的倍数(如 int 对齐到 4 字节,short 对齐到 2 字节)。
    • 结构总大小必须是最大对齐要求的倍数。
  2. 填充规则:
    • 如果下一个成员的起始地址不满足对齐要求,会插入填充字节(padding)。

分析结果:

(1) struct S1 { short s; char c; int i; char d; };

成员类型偏移量填充说明
sshort00占 2 字节,对齐到 2
cchar21占 1 字节,对齐到 1
iint40占 4 字节,对齐到 4
dchar83占 1 字节,对齐到 1
  • 总大小:12 字节(最大对齐单位为 4)。
  • 对齐要求:4 字节。

(2) struct S2 { int i; short s; char c; char d; };

成员类型偏移量填充说明
iint00占 4 字节,对齐到 4
sshort40占 2 字节,对齐到 2
cchar60占 1 字节,对齐到 1
dchar71占 1 字节,对齐到 1
  • 总大小:8 字节(最大对齐单位为 4)。
  • 对齐要求:4 字节。

(3) struct S3 { char c; short s; int i; char d; };

成员类型偏移量填充说明
cchar01占 1 字节,对齐到 1
sshort20占 2 字节,对齐到 2
iint40占 4 字节,对齐到 4
dchar83占 1 字节,对齐到 1
  • 总大小:12 字节(最大对齐单位为 4)。
  • 对齐要求:4 字节。

(4) struct S4 { short s[3]; char c; };

成员类型偏移量填充说明
sshort[3]00占 6 字节,对齐到 2
cchar61占 1 字节,对齐到 1
  • 总大小:8 字节(最大对齐单位为 2)。
  • 对齐要求:2 字节。

(5) struct S5 { char c[3]; short *s; int i; char d; double e; };

成员类型偏移量填充说明
cchar[3]01占 3 字节,对齐到 1
sshort*40占 4 字节,对齐到 4
iint80占 4 字节,对齐到 4
dchar123占 1 字节,对齐到 1
edouble160占 8 字节,对齐到 8
  • 总大小:24 字节(最大对齐单位为 8)。
  • 对齐要求:8 字节。

(6) struct S6 { struct S1 c[3]; struct S2 *s; char d; };

成员类型偏移量填充说明
cS1[3]00S1 每个 12 字节,共 36 字节
sstruct S2*360占 4 字节,对齐到 4
dchar403占 1 字节,对齐到 1
  • 总大小:44 字节(最大对齐单位为 4)。
  • 对齐要求:4 字节。

结果总结:

结构体成员偏移量总大小对齐要求
S10, 2, 4, 8124 字节
S20, 4, 6, 784 字节
S30, 2, 4, 8124 字节
S40, 682 字节
S50, 4, 8, 12, 16248 字节
S60, 36, 40444 字节

Copilot

在 IA-32/Linux 下,结构体成员的对齐要求通常是成员大小的倍数。以下是每个结构体成员的偏移量、结构体的总大小以及对齐要求。

(1) struct S1

struct S1 { 

    short s;  // 2 bytes

    char c;   // 1 byte

    int i;    // 4 bytes

    char d;   // 1 byte

};
  • short s:偏移量 0,大小 2,2 字节对齐
  • char c:偏移量 2,大小 1,1 字节对齐
  • int i:偏移量 4,大小 4,4 字节对齐
  • char d:偏移量 8,大小 1,1 字节对齐
  • 总大小:12 字节(因为 int 需要 4 字节对齐)

(2) struct S2

struct S2 { 

    int i;    // 4 bytes

    short s;  // 2 bytes

    char c;   // 1 byte

    char d;   // 1 byte

};
  • int i:偏移量 0,大小 4,4 字节对齐
  • short s:偏移量 4,大小 2,2 字节对齐
  • char c:偏移量 6,大小 1,1 字节对齐
  • char d:偏移量 7,大小 1,1 字节对齐
  • 总大小:8 字节(因为 int 需要 4 字节对齐)

(3) struct S3

struct S3 { 

    char c;   // 1 byte

    short s;  // 2 bytes

    int i;    // 4 bytes

    char d;   // 1 byte

};
  • char c:偏移量 0,大小 1,1 字节对齐
  • short s:偏移量 2,大小 2,2 字节对齐
  • int i:偏移量 4,大小 4,4 字节对齐
  • char d:偏移量 8,大小 1,1 字节对齐
  • 总大小:12 字节(因为 int 需要 4 字节对齐)

(4) struct S4

struct S4 { 

    short s[3];  // 6 bytes

    char c;      // 1 byte

};
  • short s[3]:偏移量 0,大小 6,2 字节对齐
  • char c:偏移量 6,大小 1,1 字节对齐
  • 总大小:8 字节(因为 short 需要 2 字节对齐)

(5) struct S5

struct S5 { 

    char c[3];   // 3 bytes

    short *s;    // 4 bytes

    int i;       // 4 bytes

    char d;      // 1 byte

    double e;    // 8 bytes

};
  • char c[3]:偏移量 0,大小 3,1 字节对齐
  • short *s:偏移量 4,大小 4,4 字节对齐(因为指针需要 4 字节对齐)
  • int i:偏移量 8,大小 4,4 字节对齐
  • char d:偏移量 12,大小 1,1 字节对齐
  • double e:偏移量 16,大小 8,8 字节对齐
  • 总大小:24 字节(因为 double 需要 8 字节对齐)

(6) struct S6

struct S6 { 

    struct S1 c[3];  // 3 * 12 bytes = 36 bytes

    struct S2 *s;    // 4 bytes

    char d;          // 1 byte

};
  • struct S1 c[3]:偏移量 0,大小 36,4 字节对齐(因为 struct S1 需要 4 字节对齐)
  • struct S2 *s:偏移量 36,大小 4,4 字节对齐
  • char d:偏移量 40,大小 1,1 字节对齐
  • 总大小:44 字节(因为 struct S1 需要 4 字节对齐)

总结:

  • struct S1:总大小 12 字节,4 字节对齐
  • struct S2:总大小 8 字节,4 字节对齐
  • struct S3:总大小 12 字节,4 字节对齐
  • struct S4:总大小 8 字节,2 字节对齐
  • struct S5:总大小 24 字节,8 字节对齐
  • struct S6:总大小 44 字节,4 字节对齐


(1) struct S1 { short s; char c; int i; char d; };

(2) struct S2 { int i; short s; char c; char d; };

(3) struct S3 { char c; short s; int i; char d; };

(4) struct S4 { short s[3]; char c; };

(5) struct S5 { char c[3]; short *s; int i; char d; double e; };

(6) struct S6 { struct S1 c[3]; struct S2 *s; char d; };
Profile Image of the Author
Sonder
好想要技术
这是公告标题
这只是一个公告
分类
标签
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录