2012-11-19 14 views
5

domanda noob qui: Sto provando a scrivere un'interfaccia di menu semplice, ma continuo a ricevere un errore di errore di segmentazione e non riesco a capire perché.errore di segmentazione utilizzando scanf

#include <stdlib.h> 
#include <stdio.h> 
int flush(); int add(char *name, char *password, char *type); int delete(char *name); 
int edit(char *name, char *password, char *type, char *newName, char *newPassword, char   *newType); 
int verify(char *name, char *password); 



int menu(){ 
    int input; 
    char *name, *password, *type, *newName, *newPassword, *newType; 
    printf("MAIN MENU \n ============\n"); 
    printf("1. ADD\n"); 
    printf("2. DELETE\n"); 
    printf("3. EDIT\n"); 
    printf("4. VERIFY\n"); 
    printf("5. Exit\n"); 
    printf("Selection:"); 
    scanf("%d", &input); 
    flush(); 
    switch (input){ 

    case 1: 
     printf("%s\n", "Enter Name:"); 
     scanf("%s", name); 
     flush(); 
     printf("%s\n", "enter password"); 
     scanf("%s", password); 
     flush(); 
     printf("%s\n","enter type"); 
     scanf("%s",type); 
     add(name, password, type); 
     menu(); 
     break; 
    case 2: 
     printf("Enter Name:"); 
     scanf("%s",name); 
     flush(); 
     delete(name); 
     menu(); 
     break; 
    case 3: 
     printf("Enter Name:\n"); 
     scanf("%s",name); 
     flush(); 
     printf("Enter Password\n"); 
     scanf("%s", password); 
     flush();    
     printf("enter type:\n"); 
     scanf("%s", type); 
     flush(); 
     printf("enter your new username:\n"); 
     scanf("%s",newName); 
     flush(); 
     printf("enter your new password\n"); 
     scanf("%s", newPassword); 
     flush(); 
     printf("enter your new type\n"); 
     scanf("%s",newType); 
     flush(); 
     edit(name, password, type, newName, newPassword, newType); 
     menu(); 
     break; 
    case 4: 
     printf("Enter Name\n"); 
     scanf("%s",name); 
     flush(); 
     printf("Enter Password\n"); 
     scanf("%s",password); 
     flush(); 
     verify(name, password); 
     menu(); 
     break; 
    case 5: 
     return 0; 
    default: 
     printf("invalid input, please select from the following:\n"); 
     menu(); 
} 
    return 0; 
    } 

    int flush(){ 
    int ch; 
    while ((ch = getchar()) != EOF && ch != '\n') ; 
    return 0; 
    } 

ottengo l'errore di segmentazione dopo aver inserito due campi, in qualsiasi opzione di menu

+1

Non hai riservato alcuna memoria per le tue stringhe. Un puntatore non inizializzato è un puntatore non inizializzato. – chris

risposta

6

è necessario inizializzare i puntatori. In alternativa, utilizzare matrici allocate allo stack.

Ad esempio, anziché char *name, fare char name[20]. (Si noti che questo limiterà il vostro ingresso a 19 caratteri, utilizzare un buffer più grande, se necessario.)

In questo momento, si sta passando puntatori non inizializzati in scanf() essere certi che vengano scanf() sta per scrivere in un indefinita zona di memoria. Potrebbe funzionare su una esecuzione e poi fallire sulla successiva. Potrebbe danneggiare la memoria altrove nello spazio degli indirizzi del processo.

Non utilizzare variabili non inizializzate e prendere in considerazione la possibilità di aumentare gli avvisi del compilatore quanto più possibile; il compilatore può rilevare errori come questo ed emettere un avviso.

2

Invece di utilizzare * nome, * password, .. utilizzare nome [100], password [100], ... Se si desidera nome, password, .. essere puntatore quindi allocare memoria utilizzando malloc o calloc prima di chiamare scanf.