2015-10-14 21 views
5

Di seguito è riportato lo snippet di codice. Voglio sapere se il typecasting line no. 17 è valido e corretto in c?lancia il puntatore al puntatore a un array

#include <stdio.h> 

typedef int twoInts[2]; 

void print(twoInts *twoIntsPtr); 
void intermediate (twoInts twoIntsAppearsByValue); 

int main() { 
    twoInts a; 
    a[0] = 0; 
    a[1] = 1; 
    print(&a); 
    intermediate(a); 
    return 0; 
} 
void intermediate(twoInts b) { 
    print((int(*)[])b); // <<< line no. 17 <<< 
} 

void print(twoInts *c){ 
    printf("%d\n%d\n", (*c)[0], (*c)[1]); 
} 

Inoltre, quando cambio la definizione intermediate a

void intermediate(twoInts b) { 
    print(&b); 
} 

sto ottenendo qui di seguito gli avvertimenti durante la compilazione e O/P non è corretta.

1.c:17:11: warning: passing argument 1 of print from incompatible pointer type 
    print(&b); 
     ^
1.c:5:6: note: expected int (*)[2] but argument is of type int ** 
void print(twoInts *twoIntsPtr); 

Come per la mia comprensione, array è in decomposizione a pointer to int in discussione funtion. Qual è la ragione esatta?

+3

Lasciatemi aggiungere: 'void print (twoInts * twoIntsPtr);' identico a: 'void print (int (* twoIntsPtr) [2]);' In altre parole, non nascondere array e puntatori dietro typedef. – this

+2

La soluzione migliore e adeguata al problema, è infatti non nascondere mai una matrice dietro un typedef. Quindi potresti usare semplici puntatori "int *" senza la necessità di nascondere il programma all'oblio. – Lundin

+0

Direi che 'print ((twoInts *) &b);' dovrebbe fare. – alk

risposta

3

a è un array. Quindi, quando lo passi a intermediate(), viene convertito in un puntatore al suo primo elemento (ovvero "decadimento dell'array").

Così, il b in:

void intermediate(twoInts b) { 
    print(&b); 
} 

è di tipo int*, non int[2] come ci si potrebbe sembrano aspettarsi. Quindi, &b è di tipo int** anziché int (*)[2] previsto dalla funzione print(). Quindi, i tipi non corrispondono.

Se si cambia intermediate() a:

void intermediate(twoInts *b) { 
    print(b); 
} 

quindi non avrebbe bisogno di passare l'indirizzo del &b e sarà come previsto e le tipologie sarebbe partita in modo corretto.

Problemi correlati