2013-09-21 8 views
5

Di solito quando si inizializza un array, ci sarebbe probabilmente fare:È ok avere elementi in eccesso nell'inizializzatore di array?

int arr[] = {1, 2, 3, 4, 5}; 

Ma è ok per limitare esplicitamente la lunghezza della matrice, come di seguito? :

int arr[3] = {1, 2, 3, 4, 5}; 

Nonostante alcuni avvisi dal compilatore, l'eseguibile non sembra avere alcun problema.

+3

Ma perché farlo anche – aaronman

+1

Di solito è una buona idea prestare attenzione agli avvisi. Ma il compilatore è abbastanza gentile da ignorare le tue divagazioni su elementi extra. Tuttavia ritengo che questa sia una programmazione sciatta. –

+0

Qual è la motivazione per fare è? Non vedo alcun uso pratico per questo, perché è importante? –

risposta

8

No, non è OK. Da C99, 6.7.8.2:

Vincoli

  1. No initializer cercherà di fornire un valore per un oggetto non contenuta all'interno dell'entità in fase di inizializzazione.

Nella mia lettura, ciò significa che la fornitura di elementi di inizializzazione in eccesso è una violazione vincolo, quindi invoca un comportamento indefinito.

+0

Per chiarire vuoi dire che nell'esempio sopra arr [5] e sopra è definito comportamento ma arr [4] e sotto non è definito? – Pacerier

+1

@Pacerier Se ho capito correttamente lo standard, allora sì, esattamente. –

Problemi correlati