|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 980
|
[C] Realloc: Segmentation Fault
Ragazzi, ho un grave problema, sicuramente facile da identificare, ma io non ci riesco! Un programma che sto scrivendo mi va in seg.fault!
L'allocazione avviene tramite questa funzione: Codice:
int Alloca_Memoria( CONTATTI **Ptr, int dim )
{
CONTATTI *Nuovo_Ptr = NULL; /* nuovo puntatore... */
/* ...che contiene il risultato della chiamata a realloc */
Nuovo_Ptr = ( CONTATTI * )realloc( *Ptr, dim * sizeof( CONTATTI ) );
if( Nuovo_Ptr == NULL )
{
/* realloc restituendo NULL ci avvisa che non c'e' memoria disponibile
* per allocare lo spazio richiesto */
return (0);
}
else
{
/* l'allocazione ha avuto successo e si utilizza il nuovo indirizzo
* di memoria che contiene lo spazio necessario */
Pausa();
*Ptr = Nuovo_Ptr;
return (1);
}
}
Codice:
void Aggiungi_Contatto( CONTATTI **Rubrica, int *num_contatti )
{
/* per lavorare sul numero dei contatti presenti in rubrica */
int chiave = *num_contatti;
/* se Alloca_Memoria restituisce 1 */
if( Alloca_Memoria( Rubrica, chiave + 1 ) )
{
/* inserisci Contatto */
Menu_Aggiungi_Contatto();
/* assegnazione ID */
Rubrica[chiave]->ID = chiave;
SVUOTA_STDIN;
printf( "Inserisci il nome: " );
Inserisci_Stringa( Rubrica[chiave]->Nome );
printf( "Inserisci il cognome: " );
Inserisci_Stringa( Rubrica[chiave]->Cognome );
chiave++;
*num_contatti = chiave;
Pausa();
}
else
{
printf("Impossibile aggiungere il contatto! Memoria non disponibile.\n");
Pausa();
}
}
La cosa... (Gravissima) è che non riesco a capire il perchè!
__________________
Workstation: CPU AMD Ryzen 5900X @ 4950 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | B&W Px7 S3 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync Premium |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 980
|
Quote:
__________________
Workstation: CPU AMD Ryzen 5900X @ 4950 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | B&W Px7 S3 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync Premium |
|
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Supponiamo che tu con malloc/realloc, allochi un certo numero di CONTATTI. Codice:
+---------+
| | 1000
+---------+
| | 1010
+---------+
| | 1020
+---------+
....
Poi hai una variabile che tiene il puntatore a questi contatti, per esempio: Codice:
+---------+ | 1000 | 2000 +---------+ Quindi devi "indicizzare" il puntatore ai contatti che è (*Rubrica)[i] e non Rubrica[i] Facendo ad esempio Rubrica[1], tu prenderesti il contenuto della cella all'indirizzo 2004. Cosa sbagliata, ovviamente. EDIT Aggiungo questo: se ti chiedi perchè tu hai usato '->' mentre io il punto '.' è semplice. Rubrica[i] è un puntatore (hai dereferenziato solo 1 volta Rubrica) mentre (*Rubrica)[i] è già la struttura CONTATTI (ho dereferenziato 2 volte Rubrica) e quindi ci vuole il punto.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) Ultima modifica di andbin : 03-11-2006 alle 12:10. |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2000
Città: Napoli
Messaggi: 980
|
Grazie per le risposta, sei stato chiarissimo!
__________________
Workstation: CPU AMD Ryzen 5900X @ 4950 MHz | RAM Corsair DDR4 64GB @ 3.6GHz | MoBo Gigabyte B550 AORUS Pro V2 | NVMe 1TB ~ WD Black SN850 | Storage 20 TB ~ HGST 7200RPM | PSU Fractal Ion+ 2 860W | GPU AMD Radeon RX 9070 XT | Mouse Logitech G Pro | Tastiera Logitech G915 TKL -- Audio/Video: AVR Denon X1300W 4K | Interfaccia audio Steinberg UR22 MKII | Casse 2x Klipsch RP-160M | Cuffie Sennheiser HD 650 | B&W Px7 S3 | Mic Oktava MK 012 Black | Display LG OLED 48" @ 2160p 120Hz FreeSync Premium |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 04:41.


















