получение компенсации сбоев члена структуры

Насколько я знаю макрос «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;
}

Мои вопросы:

  • Является ли приведение типа причиной сбоя. Почему нельзя рассчитать смещение первого члена, а printf может?
  • Почему мы должны печатать. Это должно быть сделано?

Любые мнения действительно ценятся 🙂

0

Решение

Насколько я знаю макрос «offsetof» определяется как …

Дело не в том, что это является определяется как таковой. Это может определиться так В общем, выполнение арифметики указателя на NULL Указатель ведет к неопределенному поведению, но если ваша библиотека C делает это, то это должно быть хорошо в вашей конкретной системе.

Это, кстати, также вылетает для меня на OS X 10.9 с clang++, Оно делает не падение с помощью offsetof, хоть. Вывод: неопределенное поведение не определено, детали реализации являются деталями реализации, и вы не должны полагаться на них или делать предположения о них.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]