Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Problema con deallocazione di puntatori doppi

    ciao a tutti! ho un grosso problema che non riesco a risolvere
    Durante l'esecuzione, mi viene dato il solito errore delle free():

    *** glibc detected *** ... : free(): invalid pointer: 0x0804d500 ***

    potreste aiutarmi a risolvere questo problema? Perché proprio non capisco... Ho fatto questo procedimento:

    ho dichiarato dei puntatori che verranno passati ad un puntatore struttura in questo modo:

    codice:
    	nome = malloc(20 * sizeof(char *));
    	cognome = malloc (20 * sizeof(char *));
    	list = malloc (100 * sizeof(char **));
    	for(i=0;i<=100;i++)
    		list[i] = malloc (20 * sizeof(char *));
    poi ho allocato i puntatori (facenti parte della struttura) in questo modo:

    codice:
     
    
    struct nomi *construct_struct(int numero, char *nome, char *cognome, char **list)
    {
    	int i;
    
    	struct nomi *this = malloc(sizeof(struct nomi));
    	this->numero = numero;
    	this->nome = malloc((strlen(nome) + 1) * sizeof(char *));
    	strcpy(this->nome, nome);
    	this->cognome = malloc((strlen(cognome) + 1) * sizeof(char *));
    	strcpy(this->cognome, cognome);
    	this->list = malloc ((strlen((char *)list)+1) * sizeof (char));
    	for(i=0;i<=100;i++)
    		this->list[i] = malloc ((strlen(list[i])+1) * sizeof (char *));
    	strcpy((char *)this->list,(char *) list);
    	for(i=0;i<=100;i++)
    		strcpy(this->list[i], list[i]);
    
    	return this;
    }
    e alla fine della funzione che dealloca le singole parti della struttura ho scritto questo:

    codice:
    void destruct_struct(struct nomi *elenco)
    {
    	int i;
    
    	free(elenco->nome);
    	free(elenco->cognome);
    	for(i=0;i<=100;i++)
    		free(elenco->list[i]);
    	free(elenco->list);
    	free(elenco);
    }
    l'errore mi viene dato alla deallocazione del puntatore doppio chiamato "list"...
    Qualcuno sa spiegarmi perché?
    Grazie infinite per l'aiuto

  2. #2
    codice:
    this->list = malloc ((strlen((char *)list)+1) * sizeof (char));
    	for(i=0;i<=100;i++)
    		this->list[i] = malloc ((strlen(list[i])+1) * sizeof (char *));
    	strcpy((char *)this->list,(char *) list);
    	for(i=0;i<=100;i++)
    		strcpy(this->list[i], list[i]);
    Sostituisci quanto qui sopra con quanto qui sotto:

    codice:
            // this list è un vettore di 100 stringhe? lo inizializzi come hai inizializzato list
            this->list = malloc(100 * sizeof(char**));
    	for(i=0;i<=100;i++){
    		this->list[i] = malloc ((strlen(list[i])+1) * sizeof (char *));
                    strcpy(this->list[i], list[i]); 
            }
    ...

  3. #3
    ok grazie mille!

  4. #4

    Re: Problema con deallocazione di puntatori doppi

    Originariamente inviato da Ennegi
    codice:
    struct nomi *construct_struct(int numero, char *nome, char *cognome, char **list)
    {
    	int i;
    
    	struct nomi *this = malloc(sizeof(struct nomi));
    "this" è una parola chiave riservata del C++. Meglio non usarla per altri scopi, anche se stai programmando in C. ;-)

  5. #5

    Re: Re: Problema con deallocazione di puntatori doppi

    Originariamente inviato da MacApp
    "this" è una parola chiave riservata del C++. Meglio non usarla per altri scopi, anche se stai programmando in C. ;-)
    tranquillo, sono le cose che piacciono al mio prof universitario e quindi devo usare certi vocaboli fino a quando non supero l'esame

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.