编译器如何解析结构成员的地址?

Pav*_*eja 0 c c++

与阵列相比,我对结构的内存组织有点困惑.数组元素可以通过数组中第一个元素的内存地址访问,并偏移到所需的索引.现在编译器如何评估结构成员的地址?

struct name
{
    int a;
    float b;
};

int main()
{
    struct name *ptr,pt,p;

    p.a=4;
    p.b=4.5;
    ptr=&pt;
    ptr->a=5;
    ptr->b=10.5;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译器如何知道,在a结构变量中存储成员值的位置p以及编译器如何评估成员的偏移量和地址b

在第二种情况下,ptr包含对结构变量的引用pt.编译器如何知道成员的内存地址.

R S*_*ahu 6

在编译时,编译器知道a的大小struct和其成员的偏移量.对于您struct name,编译器会找出以下信息.

  1. 大小 struct name
  2. 成员数据的布局
  3. 偏移量a为零,偏移量为b非零.

struct name可能的布局看起来像:

   <--- Size of struct ---------------->

   +-----------------+-----------------+
   |                 |                 |
   +-----------------+-----------------+

   ^
   |
   Address of ptr

   ^                 ^
   |                 |
   offset of a (0)   offset of b (non-zero)

给定指针指向a的地址struct name,编译器确切地知道要获得成员的a偏移量以及要获得成员的偏移量b.