PDA

View Full Version : [C]Problema con realloc


Jack-Carter
04-07-2008, 15:58
Salve a tutti, ho incontrato un problema strano nella scrittura di un programma. Il programma legge dei predicati da un file di testo, <origine> <destinazione> fatto nel modo seguente:

input.txt
P1 P5
P2 P4
P1 P4
P4 P5
P5 P6
P2 P3
P3 P6

Man mano che legge una riga, controlla se <destinazione> è già stata trovata precedentemente, e in caso affermativo, inserisce <origine> in una matrice di caratteri presente nell'area di memoria con <destinazione>, spiegazione da cani lo so, ma guardando il codice si capisce. Il problema si verifica proprio quando rialloco questa matrice, ovvero durante l'esecuzione normale non sembrano esserci problemi, ma se provo ad eseguire il debug, si blocca. Ecco il codice

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct pr{
char **ori;
char *des;
struct pr *next;
int nori;
};

struct pr *newpr();

int main()
{
FILE *input;
input=fopen("input.txt", "r");
char line[7], ori[10], des[10] ;
int i, j, k, flag;
struct pr *head, *tmp, *tmpsc;
head=newpr();
tmp=newpr();
head=NULL;



while(fscanf(input, "%s %s", ori, des)!=EOF)
{
printf("%s %s\n", ori, des);
tmpsc=head;
flag=0;
tmp=newpr();
while((tmpsc!=NULL))
{
if(strcmp(tmpsc->des, des)==0)
{
printf("%s è già presente come origine\n", des);
tmpsc->ori=(char**)realloc(tmpsc->ori, tmpsc->nori+2*sizeof(char*));
tmpsc->ori[tmpsc->nori]=(char*)malloc(strlen(ori)*sizeof(char));
strcpy(tmpsc->ori[tmpsc->nori], ori);
tmpsc->nori=tmpsc->nori+1;
flag=1;
}
tmpsc=tmpsc->next;
}
if(flag==0)
{
tmp->des=malloc(strlen(des)*sizeof(char));
tmp->ori=(char**)malloc(sizeof(char*));
tmp->ori[0]=(char*)malloc(strlen(ori)*sizeof(char));
strcpy(tmp->des, des);
strcpy(tmp->ori[0], ori);
tmp->nori=tmp->nori+1;
tmp->next=head;

head=tmp;
//free(tmp);

}

}
return 0;
}

struct pr *newpr()
{
struct pr *newprt;

newprt=malloc(sizeof(struct pr));
if(newprt==NULL)
{
printf("ERRORE");
}

return newprt;
}

L'area evidenziata in rosso è quella che da problemi, spero possiate illuminarmi, grazie.

wingman87
04-07-2008, 18:12
Mmm non è che in realtà volevi scrivere:
(tmpsc->nori+2)*sizeof(char*)
?
Non ho letto tutto il codice, solo la riga incriminata ma mi sembra strana una realloc fatta in questo modo. Cosa rappresenta nori? Lo spazio che vuoi allocare deve essere sufficiente a contenere cosa?

Jack-Carter
05-07-2008, 11:32
tmpsc->ori=(char**)realloc(tmpsc->ori, tmpsc->nori+2*sizeof(char*));

tmpsc->ori è un puntatore a int che voglio ridimensionare, nella sintassi di realloc questa è l'area di memoria che si vuole ridimensionare, questa è la nuova dimensione, che corrisponde al numero di "origini" del predicato corrente, cioè il numero di predicati che da cui dipende tmpsc->dest, il resto si capisce. Ho fatto un altro programma dopo che richiedeva lo stesso tipo di realloc, e anche li mi dava problemi col debug, ma funzionava perfettamente in esecuzione normale.

wingman87
05-07-2008, 11:47
Non capisco quel +2*, non dovrebbe essere semplicemente nori*sizeof(char*) ? Anzi, visto che nori non l'hai ancora incrementato dovrebbe essere (nori+1)*sizeof(char*)