2011-12-28 5 views
1

포인터 산술을 사용하여 구조체의 특정 멤버를 인쇄하는 방법은 무엇입니까? 나는 2 명의 구성원으로 구성된 구조를 가지고있다. 그 구조에 대한 포인터의 메모리를 조작하여 구성원 j을 인쇄하고 싶습니다.구조체를 사용한 포인터 산술

포인터 유형이 증가가 올바른 크기 추가 있도록 바로 할 필요가
#include <stdio.h> 
#include <conio.h> 

typedef struct ASD 
{ 
    int i; 
    int j; 
}asd; 

void main (void) 
{ 
    asd test; 
    asd * ptr; 

    test.i = 100; 
    test.j = 200; 
    ptr = &test; 

    printf("%d",*(ptr +1)); 

    _getch(); 
} 
+0

'포인터의 메모리'와 같은 것이 없습니다. 아마도 '포인터 조작'을 의미했을까요? –

+0

왜'-> '연산자를 사용하는 대신 이것을하고 싶습니까? –

+0

@ mr.anubis 물론입니다. –

답변

1

:

printf("%d",*(((int*)ptr) +1)); 

편집 : 액세스 구조체 멤버에 포인터 연산을 사용하여 알아야 할 어떤 C 프로그래머로 쓸모가 그리고 위험합니다. -> 작업은 명명 된 멤버에 액세스하는 데 훨씬 간결하고 정확하기 때문에 쓸모가 없으며 포인터 연산을 순진하게 사용하면 많은 문제가 발생할 수 있기 때문에 위험합니다. 그러나 포인터 연산은 OP가 요구 한 것이므로 포인터 연산이 있습니다.

+0

struct가'struct foo {char d; int v; }'을 선택하면 라인을 다시 편집해야합니다. –

+0

@ Mr.Anubis : 패딩에 따라 다릅니다. 왜 OP가 (- 대신에) 포인터 연산을 사용하여 멤버에 액세스하려고하는지 모르겠으므로 질문이 발생하지 않기를 바랍니다. – thiton

+0

이것은 비표준이므로 선호하지 않아야합니다! –

10

사용 stddef.h에서 제공하는 offsetof 매크로 :

#include<stddef.h> 

main() 
{ 
    asd foo = {100, 200}; 
    unsigned char* bar = (void*)&foo; 
    printf("%d\n", *(int*)(bar+offsetof(asd, j))); 
} 

다른 방법은 패딩/정렬 문제로 실행됩니다.