|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
[C] Errore realloc()
Ciao a tutti...
Ho compilato con successo il seguente codice su Linux Ubuntu 9.04 con gcc (4.3.3) senza nessun errore o warning... Ma eseguendolo, aggiungendo anche una sola realloc() (vedi commento codice), a run-time mi da Segmentation fault! Il codice e' molto semplice: Codice:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> int addElem(char **array,int *len,const char *elem); void printElements(char **array,const int len); void freeElements(char **array,int *len); int main() { char **array; int lenght=0; array=(char**)malloc(sizeof(char*)); *array=strdup("elem1"); lenght++; puts(array[lenght-1]); if(addElem(array,&lenght,"asd2")) { printf("%d\n",lenght); puts(array[lenght-1]); } if(addElem(array,&lenght,"asd3")) { printf("%d\n",lenght); puts(array[lenght-1]); } if(addElem(array,&lenght,"asd4")) /* <== This generate the error! */ { printf("%d\n",lenght); puts(array[lenght-1]); } printElements(array,lenght); freeElements(array,&lenght); return 0; } int addElem(char **array,int *lenght,const char *elem) { if((array=realloc(array,((*lenght)+1)*sizeof(char*)))!=NULL) { array[(*lenght)++]=strdup(elem); puts(array[(*lenght)-1]); return 1; } return 0; } void printElements(char **array,const int len) { int i; for(i=0;i<len;i++) puts(array[i]); } void freeElements(char **array,int *len) { int i; for(i=0;i<(*len);i++) free(array[i]); *len=0; free(array); } Codice:
if(addElem(array,&lenght,"asd4")) { printf("%d\n",lenght); puts(array[lenght-1]); } Da cosa puo' derivare questo errore?? Grazie mille! |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Apr 2010
Messaggi: 56
|
È semplice. Se non c'è abbastanza spazio per il cambio di dimensioni, realloc sposta l'array da qualche altra parte, cambiando il puntatore.
Il problema e che tu passi il puntatore base dell'array (invece di un puntatore al puntatore base dell'array), quindi la modifica fatta da realloc non viene propagata all'esterno della funzione. |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Codice:
if((array=realloc(array,((*lenght)+1)*sizeof(char*)))!=NULL) Il tuo codice fallisce quando puts() tenta di mandare su stdout un elemento di array che non c'è. |
![]() |
![]() |
![]() |
#4 | |
Member
Iscritto dal: Apr 2010
Messaggi: 56
|
Quote:
|
|
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
![]() ![]() |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
Eg gia'..mi ha detto la stessa cosa di @lock anche il prof ma nulla da fare non riesco a correggere
Ho provato una roba del genere ma peggio di prima: Codice:
char **array; int lenght=0; array=(char**)malloc(sizeof(char*)); *array=strdup("elem1"); lenght++; puts(array[lenght-1]); if(addElem(&array,&lenght,"asd2")) { printf("%d\n",lenght); puts(array[lenght-1]); } if(addElem(&array,&lenght,"asd3")) { printf("%d\n",lenght); puts(array[lenght-1]); } if(addElem(&array,&lenght,"asd4")) { printf("%d\n",lenght); puts(array[lenght-1]); } printElements(array,lenght); freeElements(array,&lenght); return 0; } int addElem(char ***array,int *lenght,const char *elem) { *array=realloc(*array,((*lenght)+1)*sizeof(char*)); *array[(*lenght)++]=strdup(elem); puts(*array[(*lenght)-1]); return 0; } ![]() |
![]() |
![]() |
![]() |
#7 |
Member
Iscritto dal: Nov 2005
Città: Mantova
Messaggi: 115
|
RISOLTO
Ecco il codice corretto: Codice:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h> int addElem(char ***array,int *len,const char *elem); void printElements(char **array,const int len); void freeElements(char **array,int *len); int main() { char **array; int lenght=0; array=(char**)malloc(sizeof(char*)); *array=strdup("elem1"); lenght++; puts(array[lenght-1]); if(addElem(&array,&lenght,"asd2")) { printf("%d\n",lenght); puts(array[lenght-1]); } if(addElem(&array,&lenght,"asd3")) { printf("%d\n",lenght); puts(array[lenght-1]); } if(addElem(&array,&lenght,"asd4")) { printf("%d\n",lenght); puts(array[lenght-1]); } printElements(array,lenght); freeElements(array,&lenght); return 0; } int addElem(char ***array,int *lenght,const char *elem) { (*array)=realloc((*array),((*lenght)+1)*sizeof(char*)); (*array)[(*lenght)++]=strdup(elem); puts((*array)[(*lenght)-1]); return 0; } void printElements(char **array,const int len) { int i; for(i=0;i<len;i++) puts(array[i]); } void freeElements(char **array,int *len) { int i; for(i=0;i<(*len);i++) free(array[i]); *len=0; free(array); } ![]() |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Intendi queste?
Codice:
(*array)=realloc((*array),((*lenght)+1)*sizeof(char*)); (*array)[(*lenght)++]=strdup(elem); puts((*array)[(*lenght)-1]); Un'altra cosa perchè per i primi due casi andava bene? Scusa se chiedo, so che hai risolto, ma mi interessa capire il tipo di problema. |
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: Apr 2010
Messaggi: 56
|
Quote:
Codice:
*array[i] //prendi l'i-esimo elemento di array e dereferenzialo Codice:
(*array)[i] //dereferenzia array e prendine l'i-esimo elemento |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Mar 2009
Messaggi: 753
|
Giusto, giusto.... perchè lavora con puntatori....
grazie del chiarimento.... è che io mi sarei limitato a passare l'array normalmente non un puntatore a puntatore..... ma forse scopo dell'esercizio era proprio questo ![]() |
![]() |
![]() |
![]() |
#11 |
Member
Iscritto dal: Apr 2010
Messaggi: 56
|
Era quello che ha fatto lui all'inizio, ma non poteva funzionare per via del cambiamento di puntatore restituito da realloc.
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:29.