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 

편집 : 내가 전에이 코드를 본 곳 그냥 기억했다. 그것은 안으로있다 WinNT.h

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

' '에 정의 된'offsetof (structure, field)'매크로가 있습니다. 그래서 예, 코드는 유효하지만 표준 매크로를 사용하면 표준이됩니다. – 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

관련 문제