2013-05-21 20 views
15

Esistono due modi per allocare memoria a un array, la cui dimensione è sconosciuta all'inizio. Il modo più comune sta usando malloc come questomatrice malloced VS. array a lunghezza variabile

int * array; 
... // when we know the size 
array = malloc(size*sizeof(int)); 

Ma è valida anche in C99 per definire la matrice dopo che conosciamo le dimensioni.

... // when we know the size 
int array[size]; 

Sono essi assolutamente lo stesso?

+4

Il secondo, anche in C99, non è sempre valida. Secondo C99 §6.10.8.3 Macro di feature condizionali, un'implementazione può definire ** __ STDC_NO_VLA __ ** e *** not *** implementare array di lunghezza variabile, e * essere ancora in conformità standard. * – WhozCraig

+2

** Questo non è un domanda doppia **! Nessuna delle domande di riferimento ha i dettagli sulle differenze. – Jens

+2

@WhozCraig AFAIK, questa è una cosa del 2011. Non c'è nessuna sezione in quello che ho che si propone di essere una copia dello standard C99. –

risposta

26

No, non sono assolutamente uguali. Mentre entrambi permetterà di memorizzare lo stesso numero e tipo di oggetti, tenere presente che:

  • È possibile free() una matrice malloced, ma non è possibile free() un array di lunghezza variabile (anche se va fuori del campo di applicazione e cessa esistere una volta lasciato il blocco di chiusura). Nel gergo tecnico, hanno una diversa durata di conservazione : assegnato per malloc rispetto a automatico per matrici di lunghezza variabile.
  • Sebbene C non ha il concetto di una pila , molti attuazione allocare una matrice di lunghezza variabile dalla pila, mentre malloc assegna dal mucchio. Questo è un problema sui sistemi con stack limitato, ad es. molti sistemi operativi incorporati, in cui la dimensione dello stack è nell'ordine di kB, mentre l'heap è molto più grande.
  • È anche più semplice eseguire il test per un'allocazione non riuscita con malloc rispetto a una matrice di lunghezza variabile.
  • memoria malloced può essere modificata in dimensioni con realloc(), mentre VLA non può (più precisamente solo eseguendo nuovamente il blocco con una dimensione di matrice diversa - che perde il contenuto precedente).
  • Un'implementazione C89 ospitata supporta solo malloc().
  • Un'implementazione C11 ospitata potrebbe non supportare matrici di lunghezza variabile (deve quindi definire __STDC_NO_VLA__ come numero intero 1 in base a C11 6.10.8.3).
  • Tutto il resto ho perso :-)
+2

Un VLA esce dal campo di applicazione (cessa di essere visibile) alla fine del blocco contenitore perché ha un ambito di blocco.Cessa di esistere alla fine del blocco perché ha una durata di archiviazione automatica. Due cose diverse –

+0

@KeithThompson Grazie per il suggerimento sulla terminologia; Ho modificato la risposta per essere più accurata. – Jens

+2

@KeithThompson: per essere precisi, l'identificatore per l'array non rientra nell'ambito alla fine dei blocchi che lo racchiudono. Gli ambiti sono proprietà di identificatori (nomi), non di oggetti. Un oggetto può essere accessibile al di fuori dell'ambito del suo identificatore, come quando il suo indirizzo è passato a un'altra routine. –

Problemi correlati