Почему вызов 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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