Re: fwd: info liste
Stefano Di Paola <[email protected]> Tue, 08 Mar 2005 09:51:16 +0100
| Newsgroups | gmane.comp.security.italian.devel |
|---|---|
| Message-ID | <1110271876.7221.6.camel@first> |
--===============1571074025==
Content-Type: text/plain
Content-Transfer-Encoding: 7bit
non l'ho provata, ma mi sembra che l'errore sia qui:
new_libro->titolo = titolo;
char titolo[8000] e' una variabile locale, che tu poi assegni (come
puntatore al membro di new_libro->titolo, prova con
new_libro->titolo = strdup(titolo);
il problema e' che se la variabile e' locale questa ha vita solo
all'interno del suo scope, cioe' delle due grafe all'interno delle quali
la variabile e' stata dichiarata.
ogni volta che richiami la funzione, la memoria e' riutilizzata.
Ricordati d'altra parte che quando liberi la struct anche
new_libro->titolo
deve essere liberato (free).
Stefano
PS. spero che questo codice non debba andare in produzione.
scanf("%s",titolo);
ha un Buffer overflow
Il giorno lun, 07-03-2005 alle 15:19 +0100, [email protected] ha
scritto:
> Tolta sezione in html:
> http://www.expita.com/nomime.html
> Configuring Mail Clients to Send Plain ASCII Text
>
> thnx
> Koba (moderatore)
>
> ----- Forwarded message from Antonio s4tan Parata <s4tan(at)ictsc.it> -----
> From: Antonio s4tan Parata <s4tan(at)ictsc.it>
> Subject: info liste
>
> Salve a tutti,
>
> ho un grosso problema che proprio non riesco a risolvere. Sto' scrivendo un programma in C (premetto che non sono un drago in C, anzi) che fa uso delle liste. Inizialmente ho dichiarato la seguente struttura e variabile globale:
>
>
> /* ------------ Codice -----------------*/
> struct nodo_libro {
> char *titolo;
> struct nodo_libro *next;
> };
>
> typedef struct nodo_libro lista_libri;
> typedef lista_libri *ptr_lista_libri;
>
> /* Variabili Globali */
> ptr_lista_libri root_libri = NULL;
>
> /* ------------ Fine Codice ------------*/
>
> in seguito o creato la seguente funzione che inserisce un nuovo elemento nella lista, usando la variabile globale:
>
> /* ------------ Codice -----------------*/
>
> void inserisci_libro (void) {
> char titolo[8000];
>
> ptr_lista_libri new_libro, prec_libro, curr_libro; // tre nuovi puntatori lista
>
> fflush(stdin);
> printf("Inserisci il nome del libro: ");
> scanf("%s",titolo);
>
> new_libro = (ptr_lista_libri) malloc (sizeof(lista_libri));
> if (new_libro != NULL) { // creo il nuovo elemento della lista
> new_libro->titolo = titolo;
> new_libro->next = NULL;
>
> if (root_libri == NULL) { // controllo la var globale per vedere se la lista ? vuota
> root_libri = new_libro;
> }
> else { // la lista contiene qualche elemento
> curr_libro = root_libri;
> while (curr_libro!=NULL) { // scandisco tutta la lista fino alla fine
> prec_libro = curr_libro;
> curr_libro = curr_libro->next;
> }
> prec_libro->next = new_libro; // aggiungo l'elemento finale
> }
> }
>
> /* ------------ Fine Codice ------------*/
>
>
> Il problema ? che se vado a stampare la lista (in particolare il titolo) mi succede la seguente cosa, visualizza un numero corretto di elementi (ovvero se ho inserito 3 elementi ho tre visualizzazioni), ma il titolo che mi visualizza e' sempre l'ultimo che ho inserito (quindi se ho inserito i titoli A,B e C, mi visualizza per 3 volte C).
>
> Qualcuno puo' risolvere questo mio irritante problema???
>
> Grazie mille,
> s4tan
>
>
>
> P.S.
> Il ciclo che stampa gli elementi e' simile a ciclo che uso per scandire l'intera lista
>
> ----- End forwarded message -----
> ________________________________________________________
> http://www.sikurezza.org - Italian Security Mailing List
--
......---oOOo--------oOOo---......
Stefano Di Paola
Software Engineer
Email: stefano.dipaola_at_wisec.it
Email: stefano.dipaola1_at_tin.it
Web: www.wisec.it
..................................
--===============1571074025==
Content-Type: text/plain; charset="iso-8859-1"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline
________________________________________________________
http://www.sikurezza.org - Italian Security Mailing List
--===============1571074025==--