[英]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'
用指針算法打印保存年份的內存空間的正確方法是什么?
C標准並沒有真正指定結構成員的布局方式。 可能會有填充。
而不是假設year
是struct中的64個字節,您應該使用offsetof(struct Person, year)
。
如果您需要更好地控制結構在內存中的布局方式,請查看打包的結構。 它不是標准的,但是幾乎所有的編譯器都支持它們,盡管語法不同。
也就是說,第三個printf並沒有按照您的想法進行。 嘗試類似
*((size_t*) (((char*) &f) + 64))
使用原始代碼,您嘗試將year
的地址打印為size_t
,而不是值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.