Imansible deallocare la memoria nel mio programma C.

Ho bisogno del tuo aiuto per spostare la memoria nel programma qui sotto. Ho provato come puoi vedere in main, ma senza successo. Non riesco a ottenere come si fa.

#include  #include  #include  typedef struct{ char name[25]; char street[25]; char citystate[25]; char zip[6]; }student; typedef student *studinfo; /*function prototypes*/ void getinfo(student *details[], int *); int main(void) { int count = 0; student *studptr[49]; getinfo(studptr, &count);/*call getinfo function to get student info*/ /*int i = 0; for (i; iname); free(studptr[i]->street); free(studptr[i]->citystate); free(studptr[i]->zip); } */ return 0; } 

Di seguito è riportata una funzione per ottenere le informazioni dal file. Userò queste informazioni in seguito nella funzione di ordinamento e nella funzione di visualizzazione per visualizzare i risultati. Dopo di ciò dovrei deallocare il ricordo.

 void getinfo(student *details[], int *count) { char s[100]; studinfo info; /*Get student information*/ while (gets(s) != NULL) { info = (studinfo)malloc(sizeof(student)); strcpy(info->name, s); gets(info->street); gets(info->citystate); gets(info->zip); details[(*count)++] = info; /*Increase the pointer to next position*/ } /* End of while loop*/ } /* End of getinfo */ 

Ci sono tre problemi con il tuo codice:

  • Stai provando a liberare componenti di struct student . Poiché questi array di componenti non sono stati assegnati con malloc , non è ansible liberarli; è necessario liberare solo la struct stessa.
  • Stai usando gets , che può causare overrun del buffer. Dovresti invece usare fgets , passando la dimensione del buffer e lo stdin per il parametro FILE* .
  • Copiate s[100] in info->name . Questo può potenzialmente sovraccaricare il buffer, perché info->name adatta solo a 25 caratteri.

Una volta risolti questi problemi, il tuo programma dovrebbe funzionare correttamente.

Dovrebbe essere:

 int i; for (i = 0; i < count; i++) { free(studptr[i]); } 

Dal momento che hai assegnato a ogni student un singolo blocco, li liberi allo stesso modo.