|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
[C] strutture e realloc
salve, ho dichiarato una struttura di questo tipo:
Codice:
struct elementi { char *w; }; Codice:
struct elementi *str; cosi, alloco la memoria per gli elementi dell'array str, e nello stesso tempo poi alloca la memoria per ogni elemento str[i].w. Fin qui tutto bene. Ma se volessi liberare completamente la memoria occupata dalla struttura, come dovrei fare?? cioè sia quella occupata dinamicamente da ogni str[i].w e sia quella dell'array str dinamico. grazie
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread Ultima modifica di gepeppe : 21-10-2007 alle 16:00. Motivo: modifica del titolo |
![]() |
![]() |
![]() |
#2 | |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se vuoi liberare il tutto basta: - fare una free di ogni singolo puntatore str[i].w (ammesso che tu abbia usato l'allocazione dinamica anche per queste aree di memoria) - fare una free dell'intero array di strutture (free(str) in sostanza).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
cioè un:
Codice:
{ for(i = i; i<n, i++) {free(str[i].w);} free(str); }
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
tornando alla struttura, ho un problema con realloc. Ho la struttura di dimensioni 10, e se la rialloco e poi vado a leggere gli elementi mi da errore:
Codice:
struct elementi { char *w; }; struct elementi *I; int i; //prima allocazione di 10 elementi I=(struct elementi *)malloc(10*sizeof(struct elementi)); //alloco poi ogni elemento w for(i= 0; i<10; i++){ I[i].w = (char *)malloc(10*sizeof(char)); } //realloco la struttura per ampliarla I =(struct elementi *)realloc(I, 30); //alloco ora i nuovi elementi della struttura for(i= 10; i<30; i++){ I[i].w = (char *)malloc(10*sizeof(char)); } //la caricao tutta con il valore c for(i= 0; i<30; i++) strcpy(I[i].w, "c"); //vado a leggermi i valori for(i= 0; i<30; i++) printf("%s\n", I[i].w);
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread Ultima modifica di gepeppe : 22-10-2007 alle 11:21. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
nessuno mi sà aiutare con la realloc dell'esempio?
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Mar 2002
Città: Pescara - 未婚・恋人なし Moto: Honda CBR 1000 RR Casco: XR1000 Diabolic 3
Messaggi: 27578
|
Usi la realloc() in modo completamente sbagliato. Nella malloc() allochi (se la matematica non è un'opinione) 40 byte su architettura x86 32 bit, nella realloc() invece, specifichi di ridimensionare il blocco puntato da I a 30 byte. Ne consegue che al posto di ottenere un maggioramento della memoria allocata, ne ottieni invece uno shrink, causando nei for() successivi dei buffer overflow che ti portano al segfault (e precisamente nella strcpy())
Devi quindi riallocare 120 byte in totale per avere il comportamento sperato. Il programma corretto è quindi questo: Codice:
#include <stdio.h> #include <stdlib.h> #include <string.h> struct elementi { char *w; }; struct elementi *I; int main(void) { int i; /* prima allocazione di 10 elementi */ I = (struct elementi *)malloc(10*sizeof(struct elementi)); /* alloco poi ogni elemento w */ for(i = 0; i < 10; i++) { I[i].w = (char *)malloc(10*sizeof(char)); } /* realloco la struttura per ampliarla */ I = (struct elementi *)realloc(I, 30* sizeof(struct elementi)); /* alloco ora i nuovi elementi della struttura */ for(i = 10; i < 30; i++) { I[i].w = (char *)malloc(10*sizeof(char)); } /* la caricao tutta con il valore c */ for(i = 0; i < 30; i++) strcpy(I[i].w, "c"); /* vado a leggermi i valori */ for(i = 0; i < 30; i++) printf("%s\n", I[i].w); return 0; } Ultima modifica di mjordan : 22-10-2007 alle 22:48. |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
Quote:
Ti ringrazio per la spiegazione
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread Ultima modifica di gepeppe : 23-10-2007 alle 11:23. |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
riscrivo la domanda in modo migliore. Ho una struttura come quella di prima, struct x; Mettiamo di avere una funzione che modifica la struttura
Codice:
void modfy(struct x *p){ p -> dato = 3; } Codice:
struct x valori; modify(&valori); printf("valore == $d\n", valori.dato); ![]() Cioè se nel main ho: Codice:
struct valori x[10];
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread Ultima modifica di gepeppe : 23-10-2007 alle 11:49. |
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
a parte che casomai sarebbe
Codice:
struct x valori[10]; Codice:
struct valori x[10]; Codice:
void modify(struct x *p, int count) { for (int i = 0; i < count; i++) { p[i].dato = 3; } } Codice:
struct x valori[10]; modify(valori + 5); printf("valore == $d\n", valori[5].dato); Codice:
struct x valori[10]; modify(&valori[5]); printf("valore == $d\n", valori[5].dato); |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
no io voglio modificare nella funzione modify tutta la struttura, quindi nn posso passargli un solo valore. Inoltre se faccoi come hai detto tu, nella funzione modifico il valore locale della struttura, che non ritroverei all'uscita della stessa. Allora, facciamo cosi,
Codice:
void modify(struct x *p, int count) { for (int i = 0; i < count; i++) { p[i] -> .dato = 3; } } void main(){ struct x valori[10]; modfy(valori); for (int i = 0; i <10; i++) { printf("%d\n", valori[i].a); } }
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread Ultima modifica di gepeppe : 23-10-2007 alle 12:29. |
![]() |
![]() |
![]() |
#11 | ||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
più che altro non compila visto questo obbrobbrio sintattico:
Quote:
Quote:
Codice:
struct x { int dato; }; void modify(struct x *p, int count) { for (int i = 0; i < count; i++) { p[i].dato = 3; } } int main() { struct x valori[10]; modify(valori, 10); printf("valore == %d\n", valori[5].dato); return 0; } Ultima modifica di 71104 : 23-10-2007 alle 12:30. |
||
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
l'istruzione p[i].a pensavo che fosse simile all'istruzione p.a, cioè pensavo che modificasse in locale il valore di a, come con l'operatore . mentre invece io volevo usare i puntatori..e credevo che ci soffe una cosa del gennere:
p -> a (se non fosse stata un array di strutture p[n] -> (se fosse stato un array di strutture) - (l'obbrobbrio ![]() invece da quanto ho capito si deve fare p[n].a ....ho capito bene?
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
![]() |
![]() |
![]() |
#13 | ||
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Codice:
p[i] -> .dato Quote:
![]() bastano solo pochi secondi: il gcc è gratis. se non ti compila o non ti funziona torna qui e vediamo di che si tratta. non fare come i miei colleghi universitari del primo anno, che quando c'era da consegnare il programma di laboratorio non solo non lo provavano ma neanche lo compilavano: incrociavano le dita... ![]() |
||
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
si ora funziona grazie
![]()
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
[C] realloc
edit
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:54.