Почему вызов offsetof() для элемента-указателя является незаконным?Linux

Anonymous
Почему вызов offsetof() для элемента-указателя является незаконным?

Сообщение Anonymous »

Отсюда я знаю, что в C запрещено вызывать offsetof для указателя, но почему это неопределенное поведение? Стандартная реализация

Код: Выделить всё

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
кажется, подходит даже для указателя MEMBER, я не могу понять, почему это не работает.
Пример в архитектуре, где int имеет размер 4 байта:

Код: Выделить всё

#include 
#include 

struct foo {
int a;
int *ptr;
};

int main() {
printf("Offset of ptr: %zu\n", offsetof(struct foo, ptr));
return 0;
}
Этот код вернет 8, тогда как если бы ptr был просто int, он вернул бы 4. Но в обоих случаях этот элемент имеет одно и то же смещение, равное 4. .
Изменить: я сделал неверное предположение, и упомянутая ссылка недействительна. Как было объяснено, проблема заключалась в заполнении структуры

Подробнее здесь: https://stackoverflow.com/questions/784 ... ter-member

Вернуться в «Linux»