2017-01-02 3 views
0

Как насчет этого кода, он стандартный? Я видел такой код в заголовке Visual C++, он может вычислять смещения некоторых членов структуры, но как это работает?Рассчитать смещения элементов структуры без создания экземпляра

#include <iostream> 

struct Foo 
{ 
    int a; 
    int b; 
    int c; 
}; 


int main(int argc, char** argv)  
{ 
    int* i1 = (&((Foo*)0)->a); 
    int* i2 = (&((Foo*)0)->b); 
    int* i3 = (&((Foo*)0)->c); 

    std::cout << "i1 = " << i1 << "\ni2 = " << i2 << "\ni3 = " << i3 << "\n"; 
    return 0; 
} 

Results : i1 = 0, i2 = 4, i3 = 8 

Edit: Просто вспомнил, где я видел этот код раньше. Он находится в WinNT.h

#define FIELD_OFFSET(type, field) ((LONG)(LONG_PTR)&(((type *)0)->field)) 
+1

Существует стандартный макрос 'offsetof (структура, поле)', определенный в '', что делает именно это. Так что да, код действителен, но использование стандартного макроса сделает его более стандартным. – DyZ

+0

TL; DR: Реализация может делать такие вещи, вы не можете. –

+0

Что вы имеете в виду, я не могу, я могу это сделать, моя программа работает. – nikau6

ответ

2

Это довольно распространено, как макрос offsetof. Взгляните на http://en.cppreference.com/w/cpp/types/offsetof.

Он работает как расстояние между памятью каждого члена и местоположением памяти структуры. В случае вашего примера вы устанавливаете ячейку памяти структуры как 0, поэтому нет необходимости вычислять расстояние.

+0

Если вы установили свою ячейку памяти как 0 ... не будет ли оператор «->» иметь ошибку сегментации? – ChaoSXDemon

+2

segfault происходит, когда вы на самом деле пытаетесь получить доступ к переменной-члену или вызвать функцию-член. С помощью & вы просто вычисляете адрес памяти. – xosp7tom

+1

Даже начиная с местоположения 0, он все равно может быть полезен для расчета смещений. – nikau6

Смежные вопросы