访问带偏移量的嵌套结构

Access nested struct with offset

我想使用结构偏移来访问结构的嵌套元素,但以下测试程序没有正确复制字符串。我该如何修复这个片段(它崩溃了)。它似乎没有跳转到嵌套结构。

#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <string.h>

typedef struct {
    char a;
    int  b;
    char c[10];
    char d[10];
}foo_t;

typedef struct {
    foo_t foo;
}super_foo_t;

super_foo_t test;

int main() {
    memcpy(&(test.foo) + offsetof(foo_t, c), "hello", sizeof("hello"));
    printf("c should be hello:%s\n", test.foo.c);
    return 0;
}

您正在偏移 "foo_t" 指针,因此它将等同于 &test.foo[offsetof(foo_t, c)] 因为“&test.foo”是"foo_t*"...

您需要告诉编译器偏移量以字节为单位,具体如下所示:

memcpy((char*)(&(test.foo)) + offsetof(foo_t, c), "hello", sizeof("hello"));

因为 offset of 给出了以字节为单位的偏移量,您需要使用字节偏移量进行计算。所以如果你需要访问成员 "b" 你应该像下面这样写:

int * ptrB = (int*) ((char*)(&(test.foo)) + offsetof(foo_t, b));
*ptrB = 15;

我们在下面做的是,我们首先将指针转换为字节,以便编译器将偏移量计算为字节,然后我们可以 return 返回原始指针类型。