Возможные дубликаты:
Вызывает ли макрос offsetof из ‹stddef.h› неопределенное поведение?
разыменование нулевого указателя
#define _OFFS_OF_MEMBER(p_type, p_member) (size_t)&(((p_type *)NULL)->p_member)
struct a
{
int a, b;
};
size_t l = _OFFS_OF_MEMBER(struct a, b);
У меня был небольшой чат / беседа с некоторыми другими пользователями, и один из них сказал, что это разыменование и доступ к адресному пространству рядом с адресом NULL. Я сказал: взятие адреса члена не приведет к доступу, касанию или чтению значения этого члена. По стандарту полностью безопасен.
struct a* p = NULL;
size_t offset = &p->b; // this may NOT touch b, it is not dereferencing
// p->b = 0; // now, we are dereferincing: acccess violation time!
Всегда ли это безопасный способ вычисления смещения, или компиляторы могут разыменовать и испортить память рядом с адресом NULL в соответствии со стандартами?
Я знаю, что есть безопасный способ расчета смещений, предусмотренных стандартом, но мне любопытно, что вы скажете по этому поводу. Все в пользу моего объяснения: проголосуйте за этот вопрос :-)
p = 0; q = &*p;
полностью отличается отp = 0; q = &p->foo;
. Я считаю, что первое является законным C99 (и это то, что задает повторяющийся вопрос), а второе - неопределенное поведение (и это то, что задает этот вопрос). Так что этот вопрос не только не повторяется, но и есть другой ответ. (По крайней мере, ничто, процитированное до сих пор в этом или другом вопросе, не служит для ответа на него.) Этот вопрос следует снова открыть, потому что он не дубликат. - person Nemo   schedule 13.07.2011