Sopra ti avevo linkato la documentazione di realloc, guarda qual'è il primo argomento, è l'area di memoria da riallocare...
Sopra ti avevo linkato la documentazione di realloc, guarda qual'è il primo argomento, è l'area di memoria da riallocare...
"Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares
Se vuoi evitare accessi ad aree di memoria non valide, utilizza la calloc anche per G->dizionario:
codice:G->dizionario = (void**)calloc(G->N_Max ,sizeof(void*) );Ogni puntatore punta ad un indirizzo virtuale, non c'è differenza tra void*, int*, int** e char*** come dimensione.Perché essendo indirizzi virtuali, avranno tutti come dimensione i bit necessari a indirizzare ogni byte.Originariamente inviato da Scara95
Vorrei farti notare che questa allocazione di memoria ha poco senso, un puntatore a void è un puntatore a un'area di memoria senza una dimensione specifica (anche se alcuni garantiscono una grandezza pari a quella di un int per un void*, in ogni caso non è corretta e non ha un significato logico).codice:G->dizionario = (void**)malloc(sizeof(void*) * G->N_Max );
Il motivo dei cast che si fanno in C è quello di controllare la correttezza semantica delle operazioni, tutto qua.
Dunque scara95 quello che dici tu dovrebbe essere una cosa del tipo:
Inizializzando esplicitamente i puntatori a NULL.codice:G->archi = (NODO**)realloc(G->archi, sizeof(NODO)*(G->N_Max+STEP_GRAFO)); for ( i = G->N_Max; i<G->N_Max+STEP_GRAFO; i++ ) G->archi[i] = NULL;
Con i sogni possiamo conoscere il futuro...
Per evitare di entrare in questo if:
Devi settare a zero la memoria che allochi in G->dizionario.codice:if (G->dizionario[u] != NULL && G->dizionario[v] != NULL )
G->archi non può influire in alcun modo su questa cosa.
Ok perfetto quindi ho:
codice:G->dizionario = (void*)realloc(G->dizionario, sizeof(void*)*(G->N_Max+STEP_GRAFO)); for ( i = G->N_Max; i<G->N_Max+STEP_GRAFO; i++ ) G->dizionario[i] = NULL;
Con i sogni possiamo conoscere il futuro...
Mi sembrava che il tuo problema fosse:
"devo effettuare la realloc,riallocando G->archi di + STEP_NODO(cioè 100) "
Guarda che G->archi e G->dizionario sono due entità separate, fai tutto come ti ha detto scara per quanto riguarda l' allocazione di G->archi, solo che setti a zero la memoria di G->dizionario come ti ho detto:
Ma l' avevo già scritto nel post precedente.codice:G->dizionario = (void**)calloc(G->N_Max ,sizeof(void*) );
Comunque una funzione per settare la memoria è la memset, al posto avresti potuto fare:
codice:G->dizionario = (void**)malloc(G->N_Max * sizeof(void*) ); memset((void*)G->dizionario, 0, G->N_Max * sizeof(void*) );
Who Am I, forse non ti è chiara una cosa.
Devo poter inizializzare i puntatori a 0 ogni volta che faccio la realloc sia per:
NODO **G->archi
sia per void *dizionario.
Con i sogni possiamo conoscere il futuro...
codice:G->archi = (NODO**) realloc ( sizeof(NODO*) * (G->N_Max+STEP_NODO)); memset( &(void*)(G->archi)[G->N_Max], 0, STEP_NODO*sizeof(NODO*) );