|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
[C] realloc e funzione
Salve a tutti,
ho un dubbio su come funziona realloc. Il problema è che se utilizzo il seguente programma preso da cplusplus Codice:
int main ()
{
int input,n;
int count=0;
int * numbers = NULL;
do {
printf ("Enter an integer value (0 to end): ");
scanf ("%d", &input);
count++;
numbers = (int*) realloc (numbers, count * sizeof(int));
if (numbers==NULL)
{ puts ("Error (re)allocating memory"); exit (1); }
numbers[count-1]=input;
} while (input!=0);
printf ("Numbers entered: ");
for (n=0;n<count;n++) printf ("%d ",numbers[n]);
free (numbers);
return 0;
}
In sostanza dichiaro Codice:
int * numbers = NULL; Codice:
int lettura(int *numeri) Grazie a tutti.
__________________
"May the wind always be at your back and the sun upon your face. And may the wings of destiny carry you aloft to dance with the stars...." |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
E' possibile che tu abbia lasciato una dicharazione locale, nella funzione, di
int * numbers = NULL; Ovvero, non e' che per caso la tua funzione sta agendo su un array locale, senza gestire quello che e' il tuo array esterno? Come ragionevolmente ti aspetti, le Malloc, realloc, etc. sono funzioni globali. La loro allocazione non viene persa al di fuori del contesto in cui sono state chiamate.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Attenzione ad usare realloc all'interno di una funzione eprché il puntatore ritornato da realloc può essere diverso da quello contenuto precedentemente in numbers.
Per tenere aggiornato numbers devi fare così: Codice:
void f(int **numbers)
{
.....
*numbers = (int*) realloc (*numbers, count * sizeof(int));
}
int *num = (int *) calloc(10, sizeof(int));
f(&num);
Codice:
int * f(int *numbers)
{
.....
numbers = (int*) realloc(numbers, count * sizeof(int));
.....
return numbers;
}
int *num = (int *) calloc(10, sizeof(int));
num = f(num);
|
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jul 2007
Città: civitanova marche
Messaggi: 190
|
beh, credo che la seconda sia meglio in quanto a sintassi, cmq la dichiarazione di
Codice:
int *numbers=NULL
__________________
desktop: Intel Core 2Duo E6550 2,33GHz@4Mb cache, Asus P5N-E SLI, Nvidia 8500GT 512Mb, MAXTOR SATA 320GB + MAXTOR 80GB, Master DVD LG, Master CD HP, SO Kubuntu 7.10 e XP HE |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
@cionci: il tuo codice non considera l'eventualità che realloc ritorni NULL.
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Ad esempio avrei potuto fare questo: Codice:
int *old = *numbers; *numbers = (int*) realloc (*numbers, count * sizeof(int)); if(*numbers == NULL) free(old); Codice:
int *newnumbers = (int*) realloc (*numbers, count * sizeof(int));
if(newnumbers == NULL)
{
free(numbers);
*numbers = NULL;
}
|
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
Quote:
Per adesso ho risolto cosi: nel main alloco la memoria di numbers per un solo elemento(sono sicuro che uno lo deve avere per forza) Codice:
numbers=(int *)malloc(1*sizeof(int)); Così è corretto oppure alcune volte potrebbe funzionare ed altre no? Di nuovo grazie a tutti pewr i suggerimenti.
__________________
"May the wind always be at your back and the sun upon your face. And may the wings of destiny carry you aloft to dance with the stars...." |
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Te l'ho scritto sopra quello che devi fare, realloc può ritornare un puntatore diverso e quindi devi aggiornare il puntatore anche al chiamante...
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
Quote:
Codice:
int *num = (int *) calloc(10, sizeof(int)); http://www.hwupgrade.it/forum/showthread.php?t=271054
__________________
"May the wind always be at your back and the sun upon your face. And may the wings of destiny carry you aloft to dance with the stars...." |
|
|
|
|
|
|
#12 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Quote:
|
||
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
Quote:
Codice:
int legge(struct mydata *data)
{
FILE *fdati;
double *tempread=NULL;
int *vetcanali;
int count, numcanali, punti;
int t, j, i;
sceltaING(&data, &vetcanali);
punti=(int) data->INFO[10];
numcanali=(int) data->INFO[0];
count=0;
tempread=(double *)malloc(1*sizeof(double));
if((fdati=fopen(stringa,"r"))==NULL)
printf("Impossibile aprire il file");
else
{
printf("Lettura dati in corso\n");
while(fscanf(fdati,"%le",&tempread[count])>0)
{
count++;
tempread = (double*) realloc (tempread, (count+1)*sizeof(double));
}
}
if((count/numcanali)>punti)
count=punti;
for(j=0;j<numcanali;j++)
{
printf("j=%d\n",j);
printf("canale=%d\n",vetcanali[j]);
}
for(t=0;t<count;t++)
for(j=0;j<numcanali;j++)
{
i=vetcanali[j]-1;
//printf("i=%d\n",i);
data->matrice[t][j]=tempread[i+t*numcanali];
}
fclose(fdati);
free(tempread);
printf("Lettura dati - O.K.\n");
return count;
}
/****************************************************/
int sceltaING(struct mydata *data, int **canali)
{
int ii,count,input;
count=0;
do {
printf ("Enter an integer value (0 to end): ");
scanf ("%d", &input);
if(input!=0)
{
count++;
printf("Ingresso diverso da 0.\n");
*canali = (int*) realloc (*canali, count * sizeof(int));
if (canali==NULL) {
puts ("Error (re)allocating memory");
exit (1);
}
canali[count-1]=input; /*Qui mi da un warning*/
printf("canali[%d]= %d\n",count-1,canali[count-1]);
}
} while (input!=0);
}
Grazie e ciao
__________________
"May the wind always be at your back and the sun upon your face. And may the wings of destiny carry you aloft to dance with the stars...." |
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Chiaro, canali non la puoi utilizzare più così, ma devi utilizzarlo così:
(*canali)[i] salvodel, non vorrei dirtelo, ma queste sono basi del C |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
Quote:
__________________
"May the wind always be at your back and the sun upon your face. And may the wings of destiny carry you aloft to dance with the stars...." |
|
|
|
|
|
|
#16 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
![]() ok basta
|
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Quote:
La deallocazione "automatica" delle risorse alla chiusura di un'applicazione è fortemente dipendente dalla piattaforma.
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
|
Non solo: http://www.aros.org/
__________________
Per iniziare a programmare c'è solo Python con questo o quest'altro (più avanzato) libro @LinkedIn Non parlo in alcun modo a nome dell'azienda per la quale lavoro Ho poco tempo per frequentare il forum; eventualmente, contattatemi in PVT o nel mio sito. Fanboys |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:32.




















