2013-02-12 19 views
0

오류 : 구조체 또는 공용체가 아닌 다른 멤버에서 'a'멤버를 요청하십시오.다른 구조체의 구조체에 이중 포인터를 액세스하는 방법

#include<stdio.h> 

typedef struct mia { 
    int a; 
}hola; 

typedef struct m { 
    hola **r; 
}bic; 

int main() { 
    bic y; 
    scanf("%d", &(y.r->a)); 
    printf("%d", (y.r->a)); 
    return 0; 
} 
+1

이 질문에 답하기 전에'r'이 유효한 포인터를 갖고 있는지 확인하고 싶을 수도 있습니다. 지금은 하나가 아니지만 두 단계의 불명확 한 간접 참조가 있습니다. – WhozCraig

+0

'y-> r-> a' 또는'(* y.r) -> a' 또는'(** y.r) .a' – congusbongus

+0

@CongXu,'y-> r-> a'는 작동하지 않습니다. 'y'는 포인터가 아닙니다. –

답변

2

이 그것을해야 당신은 더 복잡한 구문을해야합니다

int main() 
{ 
    hola x; 
    hola *ptr = &x; 
    bic y = { &ptr }; 

    scanf("%d", &((*y.r)->a)); 
    printf("%d\n", (*y.r)->a); 
    printf("%d\n", ptr->a); 
    printf("%d\n", x.a); 

    return 0; 
} 

입력

100 

출력

100 
100 
100 

참고가 hola * 포인터를 가져올 수 :

hola *ptr = *y.r; 
printf("%d", ptr->a); 
+0

그리고 만약 내가 y를 [10] 할 수 있습니까? 'a'에 어떻게 접근합니까? 또는 'a'가 포인터 인 경우 어떻게해야합니까? – gia

2

당신이 포인터 떨어져 데이터에 액세스하기 시작하기 전에, 먼저 몇 가지 메모리를 할당 할 필요가; 그렇지 않으면 정의되지 않은 동작입니다. 현재 구조에는 두 가지 수준의 할당이 필요합니다. 하나는 hola에 대한 포인터이고 다른 하나는 hola입니다. 또한 struct의 포인터로하지 포인터, struct의 포인터에 -> 때문에 작품을 역 참조의 또 다른 레벨을 추가해야합니다

여기
bic y; 
y.r = malloc(sizeof(hola*)); 
*y.r = malloc(sizeof(hola)); 
// You need an extra level of dereference (i.e. an asterisk) 
scanf("%d", &((*y.r)->a)); 
printf("%d", ((*y.r)->a)); 
// Don't forget to free the memory you allocated, 
// in reverse order: 
free(*y.r); 
free(y.r); 

demo on ideone이다.

관련 문제