Newsgroup: it.comp.lang.c
Titolo: Allocazione dinamica della memoria

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:
[code]
struct Persona{
	char nome[30];
	char cognome[30];
};
struct vettorePersone{
	int size;
	struct Persona* elementi;
};
[/code]
Successivamente ho provato ad insere le varie strutture Persona in
elementi in questo modo:
[code]
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);
[/code]
In questo modo però ottengo un segmentation fault a runtime. Come
posso risolvere? Dove e cosa sbaglio?
Grazie, ciao ciao.

 		vett.size++;
Ci sono diversi errori.
1. incrementi due volte vett.size
2. l'ultimo elemento del vettore � *(vett.elementi+vett.size-1)
3. devi usare realloc invece di malloc
E.

 E.
Ho modificato, seguendo le tue indicazioni, queste linee di codice:
vett.elementi = (struct Persona *)realloc(vett.elementi,sizeof(struct
Persona)*(++vett.size));
*(vett.elementi+vett.size-1)=pers;
Solo che lanciando il programma è uscito un pò di tutto :-):
*** glibc detected *** ./primo.compilato: realloc(): invalid old size:
0x00007fc94d1ec970 ***
======= Backtrace: =========
/lib/libc.so.6[0x7fc94cf00948]
/lib/libc.so.6[0x7fc94cf04541]
/lib/libc.so.6(realloc+0x12f)[0x7fc94cf04fbf]
./primo.compilato[0x400939]
/lib/libc.so.6(__libc_start_main+0xe6)[0x7fc94ceab1a6]
./primo.compilato[0x400759]
======= Memory map: ========
00400000-00401000 r-xp 00000000 03:01
925939                             /home/angelo/c/primo.compilato
00601000-00602000 rw-p 00001000 03:01
925939                             /home/angelo/c/primo.compilato
01cad000-01cce000 rw-p 01cad000 00:00
0                                  [heap]
7fc948000000-7fc948021000 rw-p 7fc948000000 00:00 0
7fc948021000-7fc94c000000 ---p 7fc948021000 00:00 0
7fc94cc76000-7fc94cc8c000 r-xp 00000000 03:01
557120                     /lib/libgcc_s.so.1
7fc94cc8c000-7fc94ce8c000 ---p 00016000 03:01
557120                     /lib/libgcc_s.so.1
7fc94ce8c000-7fc94ce8d000 rw-p 00016000 03:01
557120                     /lib/libgcc_s.so.1
7fc94ce8d000-7fc94cfd7000 r-xp 00000000 03:01
557091                     /lib/
libc-2.7.so
7fc94cfd7000-7fc94d1d6000 ---p 0014a000 03:01
557091                     /lib/
libc-2.7.so
7fc94d1d6000-7fc94d1d9000 r--p 00149000 03:01
557091                     /lib/
libc-2.7.so
7fc94d1d9000-7fc94d1db000 rw-p 0014c000 03:01
557091                     /lib/
libc-2.7.so
7fc94d1db000-7fc94d1e0000 rw-p 7fc94d1db000 00:00 0
7fc94d1e0000-7fc94d1fc000 r-xp 00000000 03:01
557094                     /lib/
ld-2.7.so
7fc94d3e9000-7fc94d3eb000 rw-p 7fc94d3e9000 00:00 0
7fc94d3f5000-7fc94d3fb000 rw-p 7fc94d3f5000 00:00 0
7fc94d3fb000-7fc94d3fd000 rw-p 0001b000 03:01
557094                     /lib/
ld-2.7.so
7fff553e8000-7fff553fd000 rw-p 7ffffffea000 00:00
0                      [stack]
7fff553ff000-7fff55400000 r-xp 7fff553ff000 00:00
0                      [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00
0                  [vsyscall]
Abortito
Dove ho fatto scemenze?
Grazie, ciao ciao.


Trovato l'errore, avevo dimenticato di porre a null vett.elementi