Как я могу получить доступ к атрибуту структуры, используя простую арифметику указателей? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть эта структура вместе с методом, который ее инициализирует:

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'

Как правильно распечатать пространство памяти, в котором хранится год, используя арифметику указателей?

1 Ответ

4 голосов
/ 10 апреля 2019

Стандарт C не определяет, как устроены члены структуры;там может быть заполнение.

Вместо того, чтобы предполагать, что year составляет 64 байта в структуре, вы должны использовать offsetof(struct Person, year).

Если вам нужен больший контроль над тем, как устроена структурав памяти, посмотрите на упакованные структуры.Это не стандартно, но почти все компиляторы поддерживают их, хотя синтаксис другой.

Тем не менее, третий printf не выполняет то, что вы думаете.Попробуйте что-то вроде

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

С вашим исходным кодом вы пытаетесь напечатать адрес year как size_t, а не значение.

...