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

标签 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;
}

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

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

最佳答案

在编译时,编译器知道 struct 的大小及其成员的偏移量。 对于您的 struct name,编译器计算出以下信息。

  1. 结构名称的大小
  2. 成员(member)数据的布局
  3. a 的偏移量为零,b 的偏移量为非零。

struct name 的布局可能类似于:

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

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

   ^
   |
   Address of ptr

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

给定一个指针指向struct name的地址,编译器确切地知道要偏移多少才能到达成员a以及要偏移多少才能到达成员b.

关于c++ - 编译器如何解析结构成员的地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22754892/

相关文章:

c++ - c/c++ 中 make 项目的标准

c# - 将 C char[][] 数组编码到 C#

c++ - 使用静态 openssl 1.1.1a 编译静态 curl

python - 如何在caffe中创建数据层?

c - 为什么在 C 中允许未定义的行为

c - 用户想玩多少次游戏 c 语言

c++ - 顺便说一下获取的区别,scanf ('%s'),getline

c++ - 错误 : Variable Not declared in this scope

c - 我不明白 C 中二叉树中的函数

c - 如何将 printf 中写入的值调用到另一个 printf