【问题标题】:Changing value of a structure from another structure从另一个结构更改结构的值
【发布时间】:2014-03-06 13:04:24
【问题描述】:

我刚刚阅读了Extending a struct in C,我似乎不明白代码的某些部分是做什么的。
这是他当前的代码:

typedef struct A {
  int x;
}A;

typedef struct B {
  A a;
  int d;
}B;

void fn(){
  B *b;
  ((A*)b)->x = 10;
}

我想知道,((A*)b)->x = 10; 怎么变成了b->a.x = 10;

你如何解释那行代码?

编辑

(A*)(A*)b 做什么?

【问题讨论】:

  • 请注意b必须初始化为指向一个有效的变量。
  • Extending a struct in C的可能重复
  • 代码示例是同一个单词,问题几乎相同,这几乎肯定是重复的。

标签: c struct


【解决方案1】:

根据标准,指向结构的指针必须等于指向该结构初始成员的指针。换句话说,在其专用于存储struct A 内容的区域之前,不得在struct B 中插入填充。这就是演员阵容有效的原因:

第 6.7.2.1.13 节

在结构对象中,非位域成员和位域所在的单元的地址按声明顺序递增。一个指向结构对象的指针,经过适当的转换,指向它的初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。结构对象中可能有未命名的填充,但不是在其开头

【讨论】:

    【解决方案2】:

    试着想象一下 struct B 是如何存储在内存中的,你就会明白为什么它们是相等的。

    struct B 在内存中被放置为a,即struct A 后跟成员d

    现在,当您查看 ((A*)b) 时,它是 strcut B 强制转换为 struct A,它在内存中的第零偏移处有成员 x

    下面是典型内存布局中的struct B

    +--------------+
    |      |       |
    |  A   |   d   | 
    |      |       |
    +--------------+
    

    现在如果你再扩展一点,

    +--------------+
    |      |       |
    |  x   |   d   | 
    |      |       |
    +--------------+
    

    【讨论】:

    • b 转换为结构A
    • @Jerry 请阅读一些 C 教程或书籍。 AA* 是不同的类型。强制转换表达式的语法是括号内的类型名称。 (A) 是与 (A*) 不同的类型。
    【解决方案3】:

    如果您检查结构 A 的内存布局,它看起来像这样

    +---+ | x | +---+

    如果你再将它与B 的内存布局进行比较,它看起来像这样:

    +---+---+ | x | d | +---+---+

    当你这样看待它时,更容易理解它的工作原理。

    【讨论】:

      猜你喜欢
      • 2016-07-30
      • 2021-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      相关资源
      最近更新 更多