Problema allocazione dinamica lista

di il
5 risposte

Problema allocazione dinamica lista

Buonasera,
in primis ciao a tutti, questo è il mio primo messaggio nel forum. Sono uno studente al primo anno di università e richiedo disperatamente il vostro aiuto perchè è più di un'ora che cerco di capire cosa c'è di sbagliato nel mio codice .
Sto facendo un esercizio in cui sostanzialmente viene richiesta la possibilità di aggiungere elementi ad una lista attraverso un menù iniziale. Il fatto è che ho creato un'apposita funzione aggiungi_elementi che sembra andare per i primi 3..4..o 7 elementi dopo di che mi dà errore di allocazione, in modo casuale. Non capisco perchè ad un'esecuzione mi aggiunge 5 elementi e a quella successiva mi restituisce errore dopo soli 2 elementi.
Lascio qui sotto il codice nel caso qualcuno avesse voglia di dargli un occhio . Grazie!

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct giocatore{
    char* username;
    int punteggio;
    struct giocatore* next;
};
typedef struct giocatore nodo;
typedef struct giocatore* lista;

void aggiungi_giocatore(lista head){
    lista elem;
    elem=(lista)malloc(sizeof(nodo));
    if(elem==NULL){
        printf("\nErrore di allocazione");
    }else{
        printf("\nInserire username: ");
        scanf("%s", elem->username);
        elem->punteggio=0;
        elem->next=NULL;
        if(head==NULL){
            head=elem;
        }else{
            nodo* aux=head;
            while(aux->next!=NULL){
                aux=aux->next;
            }
            aux->next=elem;
        }
    }
}

int main(){
    int a;
    lista head;
    head=NULL;

    do{
        scanf("%d", &a);
        switch(a){
            case 1:
                aggiungi_giocatore(head);
                break;
        }
    }while(a!=0);

    return 0;
}

5 Risposte

  • Re: Problema allocazione dinamica lista

    Al di la di tutto, io vedo un grave problema

    In sede di inserimento tu fai una scanf di elem->username

    Ma elem->username non è una stringa ovvero un array di caratteri già allocato, é solo un puntatore a carattere non inizializzato, che punta chissà dove ma comunque in una zona di memoria non 'sua'
  • Re: Problema allocazione dinamica lista

    Si hai ragione, dovevo cambiarlo in:
    
    char username[N]; //Nella struct, con N definito prima
    ...
    scanf("%s", elem->username);
    
    ma poi mi è passato di mente dato che stavo cercando di capire l'altro errore.
  • Re: Problema allocazione dinamica lista

    Ma il fatto di scrivere in aree di memoria sbagliate non ti ha fatto squillare nessun campanello di allarme?
  • Re: Problema allocazione dinamica lista

    Del C/C++ soprattutto per la gestione della memoria devi imparare una cosa fondamentale (le cui motivazioni si possono approfondire magari un'altra volta) .... un errore può subdolamente essere la causa di un altro e così a catena. Quindi mai ignorare un problema e concentrarsi su un altro perché il primo può essere la causa del secondo. Quindi risolvi subito quando te ne accorgi perché la situazione dopo la correzione potrebbe cambiare totalmente
  • Re: Problema allocazione dinamica lista

    oregon ha scritto:


    Quindi mai ignorare un problema e concentrarsi su un altro perché il primo può essere la causa del secondo. Quindi risolvi subito quando te ne accorgi perché la situazione dopo la correzione potrebbe cambiare totalmente
    Stamattina ho sistemato nel codice l'array e...va. Mi ero concentrato soltanto sulla funzione e non pensavo che quel puntatore definito male potesse portare ad un errore così subdolo. Vi ringrazio per l'aiuto!
Devi accedere o registrarti per scrivere nel forum
5 risposte