Oggi stavo aiutando un mio amico con un codice C, e ho trovato un comportamento strano che non riuscivo a spiegargli perché stava accadendo. Avevamo il file TSV con una lista di interi, con un int ogni riga. La prima riga era il numero di righe della lista.Differenza tra tipo array e array allocati con malloc
Abbiamo anche un file c con un "file di lettura" molto semplice. La prima riga è stata letta a n, il numero di linee, poi c'era un'inizializzazione:
int list[n]
ed infine un ciclo di n con un fscanf.
Per piccoli n (fino a ~ 100.000), tutto andava bene. Tuttavia, abbiamo scoperto che quando n era grande (10^6), si verificava un segfault.
Infine, abbiamo cambiato l'inizializzazione elenco per
int *list = malloc(n*sizeof(int))
e tutto quando bene, anche con molto grande n.
Qualcuno può spiegare perché è successo? cosa stava causando il segfault con l'elenco int [n], che è stato interrotto quando iniziamo ad usare list = malloc (n * sizeof (int))?
Risposta molto elucidante ... grazie! –
Ottima risposta! Mi stavo chiedendo se c'è anche una differenza di velocità? –
A causa degli effetti della località di riferimento, sospetto che l'array allocato allo stack sia più veloce per accedere, e 'malloc' stesso è molto più lento di un semplice puntatore dello stack. Ma in realtà, è meglio utilizzare qualsiasi approccio sia più appropriato per l'attività in corso. – templatetypedef