|
|
|
|
Strumenti |
25-01-2008, 10:27 | #1 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
[C] Problema allocazione dinamica della memoria
Salve a tutti ho un noioso problema con l'allocazione dinamica della memoria. Quando faccio l'allocazione sembrerebbe andare tutto liscio ma quando invece vado ad utilizzare quegli array o addirittura a liberare lo spazio di memoria allocato il programma si blocca. Posto un po di righe incriminate
Codice:
struct mydata { double **matrice; double INFO[10]; double **uscite; }; int main() { /*.....................*/ data.matrice = (double **)malloc(data.INFO[6]*sizeof(double *)); for(i=0; i<data.INFO[6]; i++) data.matrice[i]=(double *)malloc(data.INFO[10]*sizeof(double *)); printf("\n\nAllocazione dinamica della mamoria\n\n"); data.matrice = (double **)malloc(data.INFO[6]*sizeof(double *)); for(i=0; i<data.INFO[6]; i++) data.matrice[i]=(double *)malloc(data.INFO_NET[10]*sizeof(double *)); data.uscite = (double **)malloc(data.INFO[6]*sizeof(double *)); if(data.uscite==NULL) printf("1 - Memoria esaurita!\n"); for(i=0; i<data.INFO[6]; i++) { data.uscite[i]=(double *)malloc(data.INFO[10]*sizeof(double *)); if(data.uscite[i]==NULL) printf("2 -Memoria esaurita! i= %d\n",i); } /*.....................*/ for(i=0; i<data.INFO[6]; i++) { free(data.matrice[i]); free(data.uscite[i]); } free(data.matrice); free(data.uscite); Come mai non va se l'allocazione della memoria va a buon fine ed essendo identica a data.matrice quest'ultima gira e l'altra no? Grazie
__________________
"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...." |
25-01-2008, 14:24 | #2 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53963
|
Codice:
data.matrice = (double **)malloc(data.INFO[6]*sizeof(double *)); for(i=0; i<data.INFO[6]; i++) data.matrice[i]=(double *)malloc(data.INFO[10]*sizeof(double)); printf("\n\nAllocazione dinamica della mamoria\n\n"); data.matrice = (double **)malloc(data.INFO[6]*sizeof(double *)); for(i=0; i<data.INFO[6]; i++) data.matrice[i]=(double *)malloc(data.INFO_NET[10]*sizeof(double)); data.uscite = (double **)malloc(data.INFO[6]*sizeof(double *)); if(data.uscite==NULL) printf("1 - Memoria esaurita!\n"); for(i=0; i<data.INFO[6]; i++) { data.uscite[i]=(double *)malloc(data.INFO[10]*sizeof(double)); if(data.uscite[i]==NULL) printf("2 -Memoria esaurita! i= %d\n",i); } |
25-01-2008, 15:35 | #3 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
Che pollo facevo l'allocazione di un array di puntatori a double giusto? Ora ho corretto ma ho due domande cruciali da farti:
Primo, che non ha una grandissima importanza ma giusto per curiosità, come faceva il rpogramma a girare correttamente e a dare gli stessi risultati che da adesso creando correttamente la matrice di double? Due, molto piu importante, continua a darmi problemi quando libero la memoria. Codice Codice:
for(i=0; i<data.INFO[6]; i++) { free(data.matrice[i]); printf("Blocco data.matrice[%d]\n",i); //free(data.uscite[i]); //printf("Blocco data.uscite[%d]\n",i); } free(data.matrice); printf("Blocco data.matrice\n"); free(data.uscite); printf("Blocco data.uscite\n"); Codice:
Blocco data.matrice[0] Blocco data.matrice[1] Blocco data.matrice[2] Se libero anche matrice.uscite non riesce neanche a liberare Blocco data.usciteID[0] poiche leggo solo Blocco data.matrice[0] e poi si blocca. Grazie
__________________
"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...." |
25-01-2008, 15:42 | #4 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53963
|
Non allocavi 4 byte per ogni elemento (sizeof(double *) == 4) invece di 8 byte.
Il programma andava in buffer overflow ed infatti ti "sporcava" le uscive. |
25-01-2008, 15:51 | #5 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
Quote:
Il programma continua a dare gli stessi risultati di prima ma adesso anche quando libero la memoria di data.matrice[][] mi da errore. Consigli su cosa fare o cosa correggere? Grazie mille.
__________________
"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...." |
|
26-01-2008, 11:14 | #6 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
Quote:
Codice:
struct mydata { double **matrice, **usciteID; double INFO_NET[10]; }; Codice:
struct mydata { double **matrice; double INFO[10]; double **uscite; }; 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...." |
|
26-01-2008, 13:50 | #7 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53963
|
Strano che tu abbia risolto solo con quella cosa. Mi fa pensare che ci sia ancora un buffer overflow a giro.
Se lo rimetti com'era prima si pianta nuovamente ? |
26-01-2008, 16:46 | #8 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
Quote:
Perché aggiungendo a fine programma le righe postate sopra per liberare la memoria non mi fa correttamente l'ultima function salva che è prima dei comandi free?????? Aspetto una tua illuminazione poiché io sono a secco di idee. Grazie edit Se ritorno nella forma iniziale si blocca appena provo a salvare il contenuto di data.uscite. Perche? Il programma al momento non fa altro che leggere il contenuro di un file metterlo in data.matrice e per verifica io ho fatto la semplice operazione di assegnazione Codice:
for(j=0;j<7;j++) for(t=0;t<punti;t++) data->usciteID[j][t]=2*(data->matrice[j][t]); Codice:
for(t=0;t<punti;t++) for(i=0; i<M; i++){ fprintf(fdati,"%.4LE\t",data->uscite[i][t]); //fprintf(fdati,"%.4LE\t",data->matrice[i][t]); questa va(giusto per verificca) } Basta solo che rimetto free o la struttura in quel modo e non mi salva piu correttamente data.uscite.
__________________
"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...." Ultima modifica di salvodel : 26-01-2008 alle 16:55. |
|
26-01-2008, 17:06 | #9 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53963
|
C'è un buffer overflow da qualche parte. Devi controllare gli indici, cercare di spostare il codice simile il più possibile in altre funzioni parametrizzando (ad esempio l'allocazione delle matrici e la deallocazione).
Ultima modifica di cionci : 26-01-2008 alle 17:34. |
26-01-2008, 19:59 | #10 | ||
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
Quote:
Codice:
malloc(data.INFO[6]*sizeof(double *)) PS Non ho capito che intendi quando dici Quote:
grazie mille come al solito
__________________
"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...." |
||
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:25.