如何使用简单的指针算法访问结构的属性?
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
,而不是值。
我有这个结构以及初始化它的方法:
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
,而不是值。