2015-11-18 13 views
5

Quando compilo il seguente codice con gcc e g++, g++ dà errore e non gcc. Si noti che il codice viene convertito da int (*)[4] a int (*)[] (che è puntatore a tipo di array incompleto).Differenza nelle regole di conversione del puntatore dell'array incompleto tra C e C++

int arr[4]; 
int (*p_arr)[] = &arr; 

Come discusso nel Incomplete array type?, C linguaggio permette questa conversione. Ma perché C++ non lo consente e restituisce l'errore error: cannot convert ‘int (*)[4]’ to ‘int (*)[]’ in assignment. So che il C++ è più sicuro dal punto di vista di C, ma questo compito è davvero non sicuro, perché la successiva dereferenziazione del puntatore (ad esempio sizeof(*p_arr)) dà comunque errore anche in C?

+0

Quale ulteriore dereferimento? – ecatmur

+0

@ecatmur Ho aggiornato la domanda con un esempio – user1969104

+0

@ user2079303 Penso che la domanda nel tuo collegamento riguardi il tipo di array incompleto ma non la conversione da tipo completo a incompleto, specialmente la differenza tra 'c' e' C++ 'a questo proposito. – user1969104

risposta

1

La conversione di per sé è sicuro, ma tenere presente che la stessa regola in C che permette questa conversione consente anche nella direzione opposta.

int main() { 
    int array[4] = {0}; 
    int (*ptr4)[4] = &array; 
    int (*ptrN)[] = ptr4; 
    int (*ptr5)[5] = ptrN; /* oh dear */ 
} 

Questo è chiaramente negativo. C++ ha rimosso questa regola, la regola che dice int[4] e int[] sono tipi compatibili e praticamente si è liberata del concetto di tipo compatibile.

Alcune conversioni specifiche che sono sicure are being considered for inclusion in a future version of C++. Includono anche la tua conversione.

0

Sì, questo compito è davvero non sicuro.

In C++, i tipi di matrice includono la dimensione. Sempre.

(prevalenza.)

+0

Perché è pericoloso, al contrario semplicemente non consentito? (Inoltre, offro i parametri del tipo di array incompleto come contro-esempio.) –

+0

@AlanStokes: Non è sicuro, ed è per questo che non è permesso. E potresti mostrarmi un esempio di uno di questi "parametri del tipo di array incompleto"? –

+0

'void f (int p []);' –