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

Chr*_*loe 27 c struct

忽略填充/对齐问题并给出以下结构,在不使用成员名称的情况下获取和设置member_b的值的最佳方法是什么.

struct mystruct {
    int member_a;
    int member_b;
}
struct mystruct *s = malloc(sizeof(struct mystruct));
Run Code Online (Sandbox Code Playgroud)

换一种方式; 您如何在指针/偏移方面表达以下内容:

s->member_b = 3;
printf("%i",s->member_b);
Run Code Online (Sandbox Code Playgroud)

我的猜测是

  • 通过查找member_a(int)的size来计算偏移量
  • 将结构转换为单个指针类型(char?)
  • 创建一个int指针并设置地址(到*charpointer + offset?)
  • 使用我的int指针设置内存内容

但是我对于转换为char类型有点困惑,或者如果类似的东西memset更合适或者通常我正在处理这个完全错误.

欢呼任何帮助

Jer*_*fin 33

你概述的方法大致是正确的,尽管你应该使用offsetof而不是试图自己计算出偏移量.我不确定你为什么提到memset- 它将一个块的内容设置为一个指定的值,这似乎与手头的问题无关.

编辑:演示代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)


R S*_*hko 26

完整的技术:

  1. 使用offsetof获取偏移量:

    b_offset = offsetof(struct mystruct,member_b);

  2. 获取结构的地址作为char*指针.

    char*sc =(char*)s;

  3. 添加将偏移量添加到结构地址,将值转换为指向相应类型的指针并取消引用:

    *(int*)(sc + b_offset)