View Full Version : [c - linux] riempire un array che cresce dinamicamente
Oceans11
11-02-2010, 16:34
Il mio obiettivo finale è quello di leggere un file di testo riga per riga e salvarlo in un array (dovrei dire matrice).
Per allenarmi con l'allocazione dinamica ho cominciato con un array monodimensionale di interi presi da stdin. Vado subito al codice che magari si capisce subito:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int *w,*v = NULL;
int i, j, count=0;
while(count < 10) {
if(count == 0) {
w = v;
}
scanf("%d",&i);
v = (int*) realloc(v, sizeof(int)*(count+1));
if (v!=NULL) {
*v=i;
}
else {
printf("errore allocazione\n");
}
count++;
}
for(j=0;j<8;j++) {
printf("%d\n", *(w+j));
}
free(v);
return 0;
}
Il programma non funziona: sono abbastanza fiducioso che la realloc faccia il suo dovere, ma poi mi perdo il puntatore al primo elemento dell'array, oppure sbaglio l'assegnazione del valore o ancora sbaglio approccio???
Fare la realloc di un vettore che non esiste non è mai una bella cosa :D
Poi fai *v = i...vai a sovrascrivere ogni volta il primo elemento del vettore, che senso ha ? La realloc il nuovo spazio te lo lascia in fondo.
Oceans11
12-02-2010, 11:07
Intanto grazie per la risposta.
realloc() changes the size of the memory block pointed to by ptr to
size bytes. The contents will be unchanged to the minimum of the old
and new sizes; newly allocated memory will be uninitialized. If ptr is
NULL, then the call is equivalent to malloc(size), for all values of
size; if size is equal to zero, and ptr is not NULL, then the call is
equivalent to free(ptr). Unless ptr is NULL, it must have been
returned by an earlier call to malloc(), calloc() or realloc(). If the
area pointed to was moved, a free(ptr) is done.
Io avevo capito che se il puntatore è NULL, la realloc si comportava come una malloc. Ma non sono sicuro di aver capito bene "unless ptr is NULL".
quindi dovrei fare *(v+count) = i;?
Non lo sapevo :D
Edit: o v[count] = i;
Oceans11
12-02-2010, 11:40
Ho potuto provare il codice proprio ora, però va in segfault (e come non potrebbe essere? :muro: )
ma se ho capito bene quello che mi dici, w non serve a niente? Io lo tenevo per salvarmi l'indirizzo di memoria di v all'istante iniziale per poi poter leggere l'array.
[EDIT] ed inoltre, realloc, a differenza di malloc, alloca memoria contigua giusto?quindi sarebbe l'unico modo per accedere ad un array dinamico con l'aritmetica dei puntatori o con gl'indici?
w non serve a niente.
[EDIT] ed inoltre, realloc, a differenza di malloc, alloca memoria contigua giusto?quindi sarebbe l'unico modo per accedere ad un array dinamico con l'aritmetica dei puntatori o con gl'indici?
No, allocano entrambi memoria contigua, quindi puoi usare entrambi.
http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/
Oceans11
12-02-2010, 11:54
anche in più chiamate? cioè se chiamo 3 volte una malloc mi alloca 3 blocchi di memoria tutti contigui?
...giusto quello che mi serviva.
ps: ho eliminato w ed ora il programma và, anche se non capisco qual'era il problema
anche in più chiamate? cioè se chiamo 3 volte una malloc mi alloca 3 blocchi di memoria tutti contigui?
Sì, ma devi assegnare il risultato a variabili diverse.
Oceans11
12-02-2010, 12:12
finalmente comincio ad avere una visione più chiara, grazie!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.