簡體   English   中英

如何使用簡單的指針算法訪問結構的屬性?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM