Насколько я знаю макрос «offsetof» определяется как:
#define offsetof(st, m) ((size_t)(&((st *)0)->m))
на основании этой ссылки: http://en.wikipedia.org/wiki/Offsetof
Поэтому я пишу свой собственный фрагмент кода для вычисления смещения членов структуры:
typedef struct{
char a;
int b;
int c;
}example_struct;
int main(int argc, char *argv[])
{
example_struct *p = 0;
printf("%p\n", &(p->a)); --> 00000000
printf("%p\n", &(p->b)); --> 00000004
printf("%p\n", &(p->c)); --> 00000008
printf("%p\n", &(p->a)); --> 0
printf("%p\n", &(p->b)); --> 4
printf("%p\n", &(p->c)); --> 8
cout << &(p->a); --> this line cause crash ???
cout << &(p->b); --> 00000004
cout << &(p->c); --> 00000008
cout << (unsigned int)&(p->a); --> 0
cout << (unsigned int)&(p->b); --> 4
cout << (unsigned int)&(p->c); --> 8
return 0;
}
Мои вопросы:
Любые мнения действительно ценятся 🙂
Насколько я знаю макрос «offsetof» определяется как …
Дело не в том, что это является определяется как таковой. Это может определиться так В общем, выполнение арифметики указателя на NULL
Указатель ведет к неопределенному поведению, но если ваша библиотека C делает это, то это должно быть хорошо в вашей конкретной системе.
Это, кстати, также вылетает для меня на OS X 10.9 с clang++
, Оно делает не падение с помощью offsetof
, хоть. Вывод: неопределенное поведение не определено, детали реализации являются деталями реализации, и вы не должны полагаться на них или делать предположения о них.
Других решений пока нет …