|
|||||||
|
|
|
![]() |
|
|
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
|
ragione
|
|
|
|
|
|
#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: 15:02.












ragione








