c - 如何通过偏移获取/设置结构成员

标签 c struct

忽略填充/对齐问题并给定以下结构,在不使用成员名称的情况下获取和设置 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/

相关文章:

c - sscanf 可选格式说明符或参数

C 填充数组参数

c - 当按值提供给函数时,结构的数组字段是否会被完全克隆?

c - 从文本文件读入结构数组时遇到问题

json - 将 JSON 文件解析为 struct golang

c - 幂函数返回减去 1 的结果

c - 字符串文字未正确打印出来

c - 使用结构类型数组进行结构黑客

c - 基于线程计算分配共享内存

c - 将一个结构体分配给 C 结构体中的另一个结构体