2013-07-30 10 views
8

Come inizializzare un array dinamico allocato con malloc? Posso fare questo:Inizializzazione di array dinamici C

int *p; 
p = malloc(3 * sizeof(*p)); 
p = {0, 1, 2}; 

... 

free(p); 

o devo fare qualcosa di simile a questa:

int *p, x; 
p = malloc(3 * sizeof(*p)); 
for (x = 0; x < 3; x++) 
    p[x] = 0; 

... 

free(p); 

o c'è un modo migliore per farlo?

+1

avete fatto significa 'p [x] = x;' invece di 'p [x] = 0;'? – Mysticial

+1

Il secondo metodo è il modo corretto. Il primo ha un errore del compilatore, vero? – Barmar

+0

http://fydo.net/gamedev/dynamic-arrays mostra come utilizzare gli array dinamici. infatti è un link molto popolare e puoi trovarlo con qualsiasi motore di ricerca principale ... – franklin

risposta

1

Penso che il modo più noioso sia l'unico modo per farlo. Ho provato il primo e non viene compilato (Dopo aver commentato le '...')

Nessun molte scorciatoie in 'C' ho guess.ac

+0

Ho sentito che alcuni programmatori usano la funzione memset() per qualcosa di simile. –

+0

@JustinChadwell Non è possibile utilizzare 'memset' per questo: http://stackoverflow.com/questions/7202411/memset-integer-array?rq=1 –

+1

@ShafikYaghmour: se qualcuno vuole cancellare l'array usando 0,' memset 'va perfettamente bene. – phoxis

3

p = {1,2,3} è sbagliato.

si può mai utilizzare questo:

int * p; 
p = {1,2,3}; 

ciclo si adatta

int *p,i; 
p = malloc(3*sizeof(int)); 
for(i = 0; i<3; ++i) 
    p[i] = i; 
14

È necessario allocare un blocco di memoria e utilizzarlo come un array come:

int *arr = malloc (sizeof (int) * n); /* n is the length of the array */ 
int i; 

for (i=0; i<n; i++) 
{ 
    arr[i] = 0; 
} 

Se è necessario inizializzare l'array con zeri, è anche possibile utilizzare la funzione memset da stdlib.

memset (arr, 0, sizeof (int) * n); 

Qui 0 è la costante con cui verrà fissato ogni locatoin della matrice. Si noti che l'ultimo argomento è il numero di byte da impostare come costante. Poiché ogni posizione dell'array memorizza un numero intero, è necessario passare il numero totale di byte come parametro.

Inoltre, se si desidera azzerare la matrice su zeri, è possibile utilizzare calloc anziché malloc. calloc restituirà il blocco di memoria dopo aver impostato le posizioni di byte allocate su zero.

Al termine, liberare il blocco di memoria free (arr).

EDIT1

Si noti che se si desidera assegnare un particolare numero intero in posizioni di un array di interi utilizzando memset allora sarà un problema. Questo perché memset interpreterà l'array come una matrice di byte e assegnerà il byte che hai assegnato a ogni byte dell'array. Quindi se vuoi memorizzare dire 11243 in ogni posizione, allora non sarà possibile.

EDIT2

noti inoltre perché ogni modificando un array int a 0 con memset tempo non può funzionare: Why does "memset(arr, -1, sizeof(arr)/sizeof(int))" not clear an integer array to -1? come sottolinea @Shafik Yaghmour

15

Invece di utilizzare

int * p; 
p = {1,2,3}; 

Possiamo usare

int * p; 
p =(int[3]){1,2,3}; 
+2

Questo è esattamente quello che stavo cercando! Molto utile se ogni singolo elemento ha il proprio valore che non può essere calcolato in alcun modo, così si finisce per scrivere l'inizializzazione per ogni elemento singolarmente. Una domanda: fa parte di qualsiasi standard C, o è specifico del compilatore? – Ignas2526

+4

Questa non è una sostituzione drop-in per un array 'malloc'-ed! Il letterale composto che stai usando per inizializzare 'p' ha una durata di archiviazione automatica. Sarà liberato automaticamente alla fine del blocco, e chiamare 'free' su di esso manualmente è un comportamento indefinito. Non è possibile utilizzarlo per allocare un array che si intende restituire o per allocare tutto ciò che deve persistere oltre il blocco corrente. – user2357112

2

Non è possibile utilizzare la sintassi suggerita. Se si dispone di un compilatore C99, però, si può fare questo:

int *p; 

p = malloc(3 * sizeof p[0]); 
memcpy(p, (int []){ 0, 1, 2 }, 3 * sizeof p[0]); 

Se il compilatore non supporta C99 letterali composti, è necessario utilizzare un modello di nome da cui copiare:

static const int p_init[] = { 0, 1, 2 }; 
int *p; 

p = malloc(3 * sizeof p[0]); 
memcpy(p, p_init, 3 * sizeof p[0]); 
+0

+1 bella risposta. –