Programma con le liste va in crash

di il
6 risposte

Programma con le liste va in crash

Salve a tutti, sto imparando da autodidatta il linguaggio C/C++ seguendo le lezione di un noto canale su youtube.
Attualmente sto studiando le liste concatenate e per esercitarmi mi sono dilettato a scrivere un programma che memorizzasse in una lista (di struct) i nomi cognomi e sesso di un gruppo di persone con la relativa stampa della lista.
Il tutto funziona, ma il problema è che dopo la stampa, anzicchè attendere un tasto per poi chiudersi, il programma va in crash.
Domanda da un milione di euro: perchè?

Ecco il codice:
#include <cstdlib>
#include <iostream>
#include <conio2.h>
#include <string.h>

using namespace std;

struct id
{
  string nome;
  string cognome;
  string sesso;
  
  id* next;
};

void insElemento(id* &lista)
{
  id* p=NULL;
  p=new id;
  cout<<"Inserire il nome dell'utente"<<endl;
  getline(cin,p->nome);
  cout<<"Inserire il cognome dell'utente"<<endl;
  getline(cin,p->cognome);
  cout<<"Inserire il sesso dell'utente (M/F)"<<endl;
  getline(cin,p->sesso);
  
  p->next=lista;
  lista=p;
}

void stampaLista(id* lista)
{
  while(lista!=NULL)
  {
    cout<<lista->nome<<endl;
    cout<<lista->cognome<<endl;
    cout<<lista->sesso<<endl;
    
    lista=lista->next;
  }
}

int main(int argc, char *argv[])
{ 
  id* p=NULL;
  p=new id;
  for(int i=1;i<=2;i++)
    insElemento(p);
   
  system("CLS");
  cout<<"Stampa della lista\n";
  stampaLista(p);
  
  delete p;
  
  system("PAUSE");  
  return EXIT_SUCCESS;
}

6 Risposte

  • Re: Programma con le liste va in crash

    Scrivi
    #include <stdlib.h>
    Poi
    system("pause") (pause in minuscolo)
    E metti il return 0, non exit_success
  • Re: Programma con le liste va in crash

    Ma no ... quelle linee non c'entrano @TheFox ...

    @2_3rr0r5 ... Il problema è nella linea

    p=new id;

    del main, che devi ELIMINARE.

    Ma anche la

    delete p;

    è sbagliata.
  • Re: Programma con le liste va in crash

    Ciao,

    Allora innanzi tutto ho notato un po' di cose che a mio avviso non sono correttissime:

    1. Tenta di non utilizzare i comandi come system("PAUSE"); perché questi sono specifici del sistema operativo
    nel tuo caso windows. Al posto di system("PAUSE") ti consiglio di usare getch() del file stdio.h dello standard C.
    2. L'header conio non mi risulta che ti serva quindi consiglio di toglierlo.

    In ogni caso ti consiglio di scrivere il codice il più portabile possibile usando getch():
    
    #include <cstdio>
    
    ....
    
    getch();
    return 0;
    
    Non penso sia necessario includere il file stdlib.h poiché tu già lo includi includendo cstdlib che dovrebbe essere lo stesso file solo referenziato dallo standard c++.

    Per quanto riguarda il crash non so come aiutarti poiché sulla mia macchina funziona. Di sicuro ciò che dice @oregon è corretto devi eliminare il p = new id che è solo uno spreco di memoria siccome lo rifai successivamente all'interno della funzione insElemento.

    Ripensandoci quel new id ti porta ad una zona di memoria di cui non conosci il contenuto e che quindi può essere diversa da NULL. In pratica nella stampa non ti fermi alla fine della lista ma continui tentando poi di accedere ad una zona di memoria alla quale non hai diritti poiché non è ancora stata allocata.
    Probabilmente sulla mia macchina ho avuto fortuna le volte in cui l'ho testata.
  • Re: Programma con le liste va in crash

    Grazie mille ragazzi...
    Era proprio così, quel
    p=new id;
    che "disturbava" il tutto.

    Per quanto riguarda i problemi di portabilità, sono d'accordissimo ma è che uno si abitua ai codici template degli IDE che si utilizzano (sia il comando "system" che la costante "EXIT_SUCCESS") ma conoscevo già il getchar().
    Mi chedevo: c'è differenza tra il getchar() e il getch()?
  • Re: Programma con le liste va in crash

    Allora nemmeno io sapevo la differenza, e mi scuso poiché ti ho detto di usare getch quando lo standard è getchar.

    getchar è una funzione standard della libreria C che prende un singolo carattere dallo standard input e lo ritorna. Essa è bufferizzata quindi se si inserisce il carattere (esempio c) bisogna poi premere invio.

    getch è una funzione definita in conio.h (e probabilmente anche in stdio poiché su mac ha funzionato) che prende un carattere dalla tastiera (che non necessariamente è equivalente ad stdin) e lo ritorna. getch non dovrebbe utilizzare buffer e quindi non dovrebbe rendere necessario premere invio dopo aver inserito il carattere.

    fonte: http://quiz.geeksforgeeks.org/difference-getchar-getch-getc-getche/

    P.S. metto anche la fonte in caso io abbia scritto qualcosa di non preciso.
  • Re: Programma con le liste va in crash

    Bene. Grazie mille
Devi accedere o registrarti per scrivere nel forum
6 risposte