首页 > 解决方案 > 如何使用简单的指针算法访问结构的属性?

问题描述

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

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'

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

标签: cmemorypointer-arithmetic

解决方案


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

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

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

也就是说,第三个 printf 并没有按照你的想法做。尝试类似的东西

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

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


推荐阅读