2014-04-17 2 views
0

충돌 구조체 멤버의 오프셋 (offset)하기 구조체 회원 :는 지금까지 매크로는 다음과 같이 정의한다 "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

한 번에 질문 하나만 시도해보십시오. 이것은 비슷한 솔루션을 찾는 다른 독자에게 도움이됩니다. –

+0

죄송합니다. 처음 질문을 게시하는 경우 : D –

답변

0

을 지금까지 매크로는 다음과 같이 정의한다 "offsetof를"내가 아는 한 ...

그것은 인 경우가 아니다 그러한 것으로 정의됩니다. 일 수도 있고, 일 수도 있습니다. 일반적으로 NULL 포인터에서 포인터 연산을 수행하면 정의되지 않은 동작이 발생하지만 C 라이브러리에서이 작업을 수행하는 경우 특정 시스템에서 정상적으로 작동해야합니다.

OS X 10.9에서 clang++으로 변경되었습니다. 그래도 이 아니고 offsetof을 사용하여이 작동하지 않습니다. 결론 : 정의되지 않은 동작은 정의되지 않았으며 구현 세부 사항은 구현 세부 사항이며 이에 의존하거나 그에 대한 가정을하지 않아야합니다.

관련 문제