Salve, ho recentemente scritto un programma con una lista di liste, quindi ho usato la funzione malloc();
In pratica, il programma esegue più volte una funzione al cui interno è presente un malloc() e, alla seconda ripetizione, il programma si blocca.
Ho messo un printf() prima e uno dopo malloc() per questo so che il blocco avviene nella riga dell' malloc.
Il programma è il seguente:
#include<stdio.h>
#include<string.h>
//
struct cro {
int cod;
char cat[16];
char nick[16];
char testo[256];
int costo;
struct cro *next;
}typedef inserzione, *inserzioni;
struct pro {
char cat[16];
int num;
inserzioni ins;
struct pro *next;
}typedef categoria, *categorie;
//
void menu(int *i);
void stampaSecond(inserzioni second);
int CaricaInserzioni(char *nomeF, inserzioni *second);
void smista(categorie *prime, inserzioni *second);
int cercaCat(categorie prime, char *categoria);
void creaCat(categorie *prime, char *categoria);
void inserisciInserzione(categorie *prime, inserzioni sup);
void stampaPrime(categorie prime);
//
int main(void) {
int i, numIns;
char nomeF[31];
categorie prime;
inserzioni second;
prime = NULL;
second = NULL;
do {
menu(&i);
switch (i) {
case 1:
printf("---\n");
//printf("Inserisci il nome del file con l'estensione\n");
//scanf("%s", nomeF);
strcpy(nomeF, "esempio.txt");
numIns = CaricaInserzioni(nomeF, &second);
printf("Ho caricato %d inserzioni\n", numIns);
printf("---\n");
break;
case 4:
printf("---\n");
smista(&prime, &second);
printf("Smistamento effettuato \n");
printf("---\n");
break;
case 7:
printf("---\n");
stampaPrime(prime);
printf("---\n");
break;
case 8:
printf("---\n");
stampaSecond(second);
printf("---\n");
break;
}
} while (i != 0);
}
//
void menu(int *i) {
printf("Inserisci:\n1) per caricare da file le inserzioni\n4) per caricare le inserzioni nella lista delle categorie\n7) per visualizzare la lista delle categorie\n8) per visualizzare la lista delle inserzioni\n0) per uscire\n");
scanf("%d", i);
}
int CaricaInserzioni(char *nomeF, inserzioni *second) {
FILE *f;
int cont = 0;
inserzioni new;
new = (inserzioni)malloc(sizeof(inserzione));
new->next = NULL;
f = fopen(nomeF, "r");
if (f == NULL) {
printf("Impossibile aprire il file\n");
return 0;
}
else {
while (fscanf(f, "%d %s %s %s %d", &new->cod, new->cat, new->nick, new->testo, &new->costo) != EOF) {
if ((*second) != NULL) {
new->next = (*second);
}
(*second) = new;
new = malloc(sizeof(inserzione));
new->next = NULL;
cont++;
}
fclose(f); //
return cont;
}
}
void stampaSecond(inserzioni second) {
if (second == NULL) {
printf("Lista Second vuota\n");
return;
}
else {
printf("Ecco la lista Second:\n");
while (second != NULL) {
printf("-\n");
printf("%d %s %s \n%s \n%d \n", second->cod, second->cat, second->nick, second->testo, second->costo);
second = second->next;
}
printf("-\n");
}
}
void smista(categorie *prime, inserzioni *second) {
inserzioni sup;
int check;
sup = (*second);
if ((*second) == NULL) {
printf("Non ci sono inserzioni da smistare \n");
return;
}
else {
while (sup != NULL) {
check = cercaCat(*prime, sup->cat);
printf("Esito ricerca: %d \n", check); //
if (check == 0) {
printf("Inserisco una nuova categoria alla lista Prime \n");
creaCat(&(*prime), sup->cat); //
printf("Categoria %s inserita \n", sup->cat);
stampaPrime(*prime);
}
printf("Inizio inserimento \n"); //
inserisciInserzione(&(*prime), sup);
printf("Inserzione inserita \n"); //
sup = sup->next;
}
}
}
int cercaCat(categorie prime, char *categoria) {
if (prime == NULL) {
printf("Lista Prime trovata vuota durante la ricerca \n"); //
return 0;
}
else {
while (prime != NULL) {
if (strcmp(prime->cat, categoria) == 0) {
printf("Categoria trovata \n");
return 1;
}
prime = prime->next;
}
printf("Categoria non trovata \n");
return 0;
}
}
void creaCat(categorie *prime, char *categoria) {
categorie new, sup, pre;
sup = (*prime);
pre = NULL;
new = (categorie)malloc(sizeof(categoria));
strcpy(new->cat, categoria);
new->num = 0;
new->ins = NULL;
new->next = NULL;
if ((*prime) == NULL) {
(*prime) = new;
}
else {
while (sup != NULL && strcmp(sup->cat, categoria) > 0) {
sup = sup->next;
}
if (pre == NULL) {
new->next = (*prime);
(*prime) = new;
}
else {
if (sup == NULL) {
pre->next = new;
}
else {
new->next = sup;
pre->next = new;
}
}
}
}
void inserisciInserzione(categorie *prime, inserzioni sup) {
categorie check;
inserzioni new;
printf("Inizio malloc \n");
new = (inserzioni)malloc(sizeof(inserzione)); // SI BLOCCA QUA AL SECONDO GIRO
printf("Fine malloc \n"); // QUESTO PRINTF NON COMPARE
new->cod = sup->cod;
strcpy(new->cat, sup->cat);
strcpy(new->nick, sup->nick);
strcpy(new->testo, sup->testo);
new->costo = sup->costo;
new->next = NULL;
check = (*prime);
while (check != NULL && strcmp(check->cat, sup->cat) != 0) {
check = check->next;
}
if (check->ins != NULL) {
new->next = check->ins;
}
check->ins = new;
check->num = check->num + 1;
}
void stampaPrime(categorie prime) {
if (prime == NULL) {
printf("Lista Prime vuota\n");
return;
}
else {
printf("Ecco la lista Prime:\n");
while (prime != NULL) {
printf("-\n");
printf("%s \n%d \n", prime->cat, prime->num);
stampaSecond(prime->ins);
prime = prime->next;
}
printf("-\n");
}
}
Il programma si blocca quando si esegue per la seconda volta la funzione: inserisciInserzione()
Con il debug, l'errore che mi dice è: HereWeGo.exe has triggered a breakpoint.
(HereWeGo sarebbe il nome del progetto in visual studio)
Sapete spiegarmi come risolvere?