2013-02-12 2 views
0

Ошибка: запрос для члена 'a' в чем-то не структуре или объединении.Как получить доступ к двойному указателю на структуру из другой структуры в c

#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

и что я могу сделать, если у меня есть bic y [10]? как мне получить доступ к «а»? или если «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.

Смежные вопросы