gpt4 book ai didi

c - 通过地址访问结构成员

转载 作者:太空狗 更新时间:2023-10-29 15:14:08 24 4
gpt4 key购买 nike

考虑一个包含两个整数类型成员的结构。我想通过地址获得两个成员。我可以成功获得第一个,但我对第二个的值(value)有误。我相信那是垃圾值(value)。这是我的代码:

#include <stdio.h>

typedef struct { int a; int b; } foo_t;

int main(int argc, char **argv)
{

foo_t f;
f.a = 2;
f.b = 4;
int a = ((int)(*(int*) &f));
int b = ((int)(*(((int*)(&f + sizeof(int))))));
printf("%d ..%d\n", a, b);
return 0;
}

我得到:

2 ..1

有人可以解释我哪里出错了吗?

最佳答案

根据 C 标准,第一个成员的偏移量必须始终为零;这就是为什么您的第一个类型转换有效的原因。但是,由于填充,第二个成员的偏移量可能不一定等于结构的第一个成员的大小。

此外,向指针添加一个数字并不会向地址添加字节数:相反,添加的是所指向事物的大小。因此,当您将 sizeof(int) 添加到 &f 时,将添加 sizeof(int)*sizeof(foo_t)

您可以使用 offsetof运算符,如果你想自己做数学运算,就像这样

int b = *((int*)(((char*)&f)+offsetof(foo_t, b)));

这样做的原因是 sizeof(char) 总是一个,正如 C 标准所要求的那样。

当然,您可以使用 &f.b 来避免手动计算。

关于c - 通过地址访问结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14096987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com