PDA

View Full Version : [C] Allocazione dinamica della memoria


Abdujaparov
20-07-2009, 13:57
Ciao a tutti,
vorrei creare un array che si allarga dinamicamente in modo da avere un vettore con tutto ciò che l'utente ha inserito da stdin.
Ho definito queste due strutture:

struct Persona{
char nome[30];
char cognome[30];
};


struct vettorePersone{
int size;
struct Persona* elementi;
};


Successivamente ho provato ad insere le varie strutture Persona in elementi in questo modo:

struct vettorePersone vett;
vett.size=0;

do{
struct Persona pers;
printf("Inserisci nome e cognome separati da spazio...\n");
scanf("%s %s", pers.nome, pers.cognome);
printf("Nome: %s\nCognome: %s\n", pers.nome, pers.cognome);
vett.elementi = (struct Persona *)malloc(sizeof(struct Persona)*(++vett.size));
*(vett.elementi+vett.size)=pers;
vett.size++;
printf("Continuare? s/n \n");
scanf("%s", risposta);
}while(strcmp(risposta,"n")!=0);




In questo modo però ottengo un segmentation fault a runtime. Come posso risolvere? Dove e cosa sbaglio?
Grazie, ciao ciao.

jack_burton1985
20-07-2009, 14:27
L'errore risiede nell'incremento di vett.size durante la malloc

vett.elementi = (struct Persona *)malloc(sizeof(struct Persona)*(++vett.size));

così facendo, nella successiva operazione di salvataggio dei dati appena inseriti

*(vett.elementi+vett.size)=pers;

andresti a lavorare sulla posizione 1 (invece di 0) dell'array, spazio che ancora non esiste.
Dovresti quindi semplicemente scrivere:

vett.elementi = (struct Persona *)malloc(sizeof(struct Persona)*(vett.size+1));


Saluti.

Abdujaparov
20-07-2009, 15:58
Ciao,
io ho provato a fare così:


vett.elementi = (struct Persona *)realloc(vett.elementi,sizeof(struct Persona)*(++vett.size));
*(vett.elementi+vett.size-1)=pers;

In questo modo sembra funzionare.
Grazie mille, ciao ciao.

jack_burton1985
20-07-2009, 16:11
Funzionare funziona ma è concettualmente sbagliato (oltre a rendere poco leggibile il tuo codice): è inutile incrementare una variabile per poi usarne il valore -1.
Senza contare che così facendo incrementi la variabile contatore ben due volte nello stesso ciclo.
L'incremento va fatto quando DEVE essere fatto.