Я искал очень долго и упорно (ссылки в самом конце) для объяснения реализации offsetof MACRO:Сложность в понимании offsetof MACRO
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
В частности, разыменования NULL, чтобы получить смещение члена в структуре. Многие статьи затушевывают причину, говоря, что указатель NULL на самом деле никогда не разыменовывается, но это не имеет смысла для меня.
Вот некоторые ссылки я попытался понимание:
- http://www.viva64.com/en/b/0301/
- http://www.embedded.com/design/prototyping-and-development/4024941/Learn-a-new-trick-with-the-offsetof--macro
- http://www.geeksforgeeks.org/the-offsetof-macro/
- How does the C offsetof macro work?
- Does dereference a NULL pointer guarantee to crash a program in C/C++?
То, что я ищу и пытаюсь понять, - шаг за шагом, смущая понимание того, как компилятор интерпретирует определение MACRO, которое в конечном итоге объяснит, как NULL-указатель фактически не разыменовывается.
EDIT: Несмотря на то, что другие вопросы ответили на мой вопрос, они имеют смысл для меня, как указано в исходном сообщении. Ответ @dasblinkenlight проливает свет на точную проблему, с которой я столкнулся с другими вопросами, и как это получается, что мы фактически не разыскиваем указатель.
Что еще вам нужно, чем этот ответ? http://stackoverflow.com/a/7898055/4966481 –
Возможный дубликат [Как работает макрос смещения C?] (http://stackoverflow.com/questions/7897877/how-does-the-c-offsetof- macro-work) –
Если 'a' является указателем на адрес 1234, а' b' является членом 'a' при смещении 12, то что такое' & a-> b'? Теперь, если 'a' указывает на адрес 0, что такое' & a-> b'? Как вы это делали в своей голове без разыгрывания 'a'? – immibis