|
ssb 님이 쓰신 글 :
: typedef struct{
: int a;
: int b;
: }c;
:
: (unsigned long)&((c*)0)->b; //<-이게 의미하는게 b의 위치를 말하는거 같은데 이해가 잘 안되네요.
[1] (c*)0 : 절대번지 0x000000을 강제적으로 "c의 포인터형"으로 형변환합니다.
[2] ((c*)0)->b : 위에서 구한 "c의 포인터형"에서 멤버인 b을 찾아갑니다.
[3] &(((c*)0)->b : 위에서 구한 b의 주소값을 가르킵니다.
[4] (unsigned long)&((c*)0)->b : 위에서 구한 주소값을 unsigned long으로 형변환합니다.
이런 뜻이구요, 여기서 [2]에서 구한 b는 아무런 의미없는 값입니다. 단순히 절대번지 0에 c를 위치시킴으로써 상대적인 b의 주소값(위치)를 파악하고자 하는 겁니다.
이렇게 하는 이유는 변수를 따로 정의하지 않고, b의 위치를 구하기 위해서 입니다. 즉, 연산만 이루어 질 뿐, 실제 메모리를 소모하지 않는 다는 겁니다.
c c_value;
&(c_value.b) - &c_value;
이렇게 해도 되나, 이렇게 하면, c_value라는 인스턴스를 만들므로 메모리를 소모하게 됩니다.
참고하세요.
<끝>
|