Non puoi utilizzare la classica definizione dell'array
in quanto il compilatore vuole che la dimensione ddegli array sia una costante. Gli array, quindi, non si possono dimensionare a run-time.codice:int mioArray[lunghezza];
Un modo per procedere, quindi, è quello che ti ho illustrato prima:
Ora ti delucido sul significato oscuro di questa bruttissima riga di codice: mioArray è un puntatore, quindi al suo interno conterrà un indirizzo di memoria e, precisamente, l'indirizzo del primo elemento dell'array che verrà allocato.codice:mioArray = (int*) malloc(lunghezza * sizeof(int));
la funzione malloc serve, appunto, ad allocare una certa quantità di memoria (serve a dire, insomma, di riservare una certa quantità di memoria che intenderai usare). Quanta memoria dovremo allocare, quindi? A questa domanda bisogna rispondere con un "non lo so"... in effetti la quantità da allocare dipende da (almeno) un fattore: la dimensione in memoria del dato. In questo caso, dato che si tratta di interi, ci dobbiamo chiedere quanto occupa un intero in memoria (su architetture diverse, infatti, un intero può occupare da 16 a 64 byte). La funzione sizeof() fa proprio questo: ritorna il numero di byte minimo atto a contenere il dato (o il tipo di dato) passato come parametro. A noi, però, non va bene allocare la quantità di memoria necessaria a contenere un solo intero, ma dobbiamo allocarne a sufficienza per contenerne una quantità pari a lunghezza. Per questo moltiplichiamo la dimensione dell'intero per il numero di interi di cui abbiamo bisogno.
Il cast a puntatore ad intero è necessario in quanto la funzione malloc ritorna il primo indirizzo di memoria utile allocato, ma solo noi sappiamo a che tipo di puntatore va assegnato (ci sono molte implicazioni sull'aritmetica dei puntatori a riguardo). La funzione malloc, di suo, ritorna un puntatore a void [ void * ], che va castato al giusto tipo di puntatore.
Spero di essere riuscito a darti delle utili informazioni.
Ciao.![]()