忽略填充/对齐问题并给定以下结构,在不使用成员名称的情况下获取和设置 member_b 值的最佳方法是什么。
struct mystruct {
int member_a;
int member_b;
}
struct mystruct *s = malloc(sizeof(struct mystruct));
换句话说;你会如何用指针/偏移来表达以下内容:
s->member_b = 3;
printf("%i",s->member_b);
我的猜测是
- 通过查找 member_a (
int
) 的大小来计算偏移量 - 将结构转换为单字指针类型(
char
?) - 创建一个
int
指针并设置地址(到*charpointer + offset
?) - 使用我的
int
指针设置内存内容
但我对转换为 char 类型感到有点困惑,或者如果像 memset
这样的东西更合适,或者如果通常我认为这是完全错误的。
为任何帮助干杯
最佳答案
尽管您应该使用 offsetof
而不是试图自己计算出偏移量,但您概述的方法大致是正确的。我不确定您为什么提到 memset
——它将 block 的内容设置为指定值,这似乎与手头的问题无关。
这里有一些代码来演示它是如何工作的:
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
typedef struct x {
int member_a;
int member_b;
} x;
int main() {
x *s = malloc(sizeof(x));
char *base;
size_t offset;
int *b;
// initialize both members to known values
s->member_a = 1;
s->member_b = 2;
// get base address
base = (char *)s;
// and the offset to member_b
offset = offsetof(x, member_b);
// Compute address of member_b
b = (int *)(base+offset);
// write to member_b via our pointer
*b = 10;
// print out via name, to show it was changed to new value.
printf("%d\n", s->member_b);
return 0;
}
关于c - 如何通过偏移获取/设置结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2043871/