2014-12-30 12 views
5
struct first_struct 
{ 
    int a; 
    int b; 
}; 

struct second_struct 
{ 
    char d; 
    int e; 
}; 

struct second_struct second_ins = {'a',10}; 
struct first_struct first_ins = {20,12}; 



int main() 
{ 
    struct second_struct *pointer = &first_ins; 
    printf("%d\n",pointer->d); 
    return 0; 
} 

E ottengo un risultato di 20. In pratica, stavo cercando di vedere che se dichiaro un puntatore di struttura, e provo a puntarlo su un'istanza di un'altra struttura, quale risultato ottengo Oltre a un avvertimento del compilatore per un tipo di puntatore incompatibile, si costruisce e funziona bene. Stavo cercando di capire come questa operazione è stata interpretata dal compilatore. Non dovrebbe essere indefinito, o potrebbe esserlo e sto solo diventando fortunato con il risultato.Puntatore di struttura che punta a un'istanza di struttura diversa

+1

'pointer-> d' è esattamente uguale a' * pointer' perché è il primo elemento nella struttura, quindi funziona correttamente. –

+0

Il primo elemento nel secondo_struct è un carattere, ed è un numero intero in first_struct. Quindi, non dovrebbe lamentarsi quando sto provando a stampare% d. Immagino di non aver capito bene il tuo commento. –

+0

Anche pointer-> e funzionerebbe correttamente. –

risposta

2

E 'probabile che sia le strutture hanno lo stesso allineamento elemento-saggio: sizeof(first_struct) == sizeof(second_struct) e: int e inizia allo stesso offset nel struct come: int b

In altre parole, char d è effettivamente memorizzato come un int in termini di disposizione. È semplicemente una coincidenza fortunata sulla tua piattaforma e non funzionerà in modo portabile.

Problemi correlati