[완료] C에서 #define foo(a, b) ( (size_t) & ((a)NULL) -> b) 이해가 안됩니다 -_-;;

hbull의 이미지

안녕하세요?

책에서 프로그래밍 관련 책에서 본 C 소스 코드 인데요,

위에 define 은 해당 구조체에서 변수의 오프셋을 출력하는 선언문이라고 하네요,
실제 아래와 같이 코딩 하면 8이라고 출력되는데, 당췌 왜 그런지 모르겠네요. -_-;;

고수님들의 답변 부탁드립니다,

#define foo(a, b) ( (size_t) & ((a)NULL) -> b)

struct Rectangle
{
int top;
int left;
int bottom;
int right;
};

int main()
{
int a;
a = foo(Rectangle*, bottom);
printf("%d", a);
}

drinkme의 이미지

stddef.h에 정의된
offsetof() 매크로와 같은겁니다.

이렇게 생각하시면 쉽습니다.

struct Rectangle t;

t를 생각할 때,
(int)&t.bottom - (int)&t.top
이러면, 8이 나오겠죠?

(int)&t.bottom - (int)&t
이래도 같겠죠?

struct Rectangle *t = 0;
이라고 할 때,
(int)&t->bottom - (int)t;
이러면 8이 나오겠죠?

근데, t는 0이잖아요.
즉,
(int)&(((struct Rectangle&)0)->bottom)
이러면, 8입니다.

select99의 이미지

구조체를 0번지부터 시작할때 bottom 맴버는 8번지인데.. 그걸출력한것..
말그대로 오프셋출력하는매크로.