如何使用简单的指针算法访问结构的属性?

How can I access the attribute of an struct using simple pointer arithmetic?

我有这个结构以及初始化它的方法:

struct Person 
{
    char name[32];
    char lastn[32];
    size_t year;
};

void init_pers(struct Person* p, const char* n, const char* ln, size_t y)
{
    strcpy(p->name, n);
    strcpy(p->lastn, ln);
    p->year = y;
}

主要是这样称呼它们的:

struct Person f;
init_pers(&f, "Alan", "Wake", 1995);

通过简单的指针运算,我能够打印前两个属性:

printf("First field: %s\n", (const char*)&f); // prints 'Alan'
printf("Second field: %s\n", (const char*)&f + 32); // prints 'Wake'

然而,当我尝试打印第三个属性时,即 size_t,我得到的不是年份:

printf("Third field: %lu\n", (size_t)&f + 64); // prints '6422317'

使用指针算法打印保存年份的 space 内存的正确方法是什么?

C 标准并没有真正指定结构成员的布局方式;可能有填充。

而不是假设 year 是结构中的 64 个字节,您应该使用 offsetof(struct Person, year).

如果您需要更多地控制结构在内存中的布局方式,请查看打包结构。它不是标准的,但几乎所有编译器都支持它们,尽管语法不同。

也就是说,第三个 printf 并没有按照您的想法进行。试试像

*((size_t*) (((char*) &f) + 64))

使用您的原始代码,您试图将 year 地址打印为 size_t,而不是值。