erreur de segmentation à l'aide de scanf
question de noob ici:
Je suis en train d'écrire un simple menu de l'interface, mais je reçois une erreur de segmentation d'erreur et je ne peux pas comprendre pourquoi.
#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;
}
J'obtiens l'erreur de segmentation après la saisie de deux champs, dans une option du menu
Vous n'avez pas réservé de la mémoire de vos chaînes. Un pointeur non initialisé est un pointeur non initialisé.
OriginalL'auteur agarrow | 2012-11-19
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin d'initialiser les pointeurs. Vous pouvez également utiliser la pile des tableaux alloués.
Par exemple, au lieu de
char *name
, nechar name[20]
. (Notez que cela permettra de limiter vos commentaires à 19 caractères; utiliser un tampon plus grand si nécessaire).Droit maintenant, vous êtes de passage de pointeurs non initialisés dans
scanf()
ce qui signifie quescanf()
va écrire à un undefined zone de la mémoire. Il peut fonctionner sur une exécution, puis l'échec sur l'autre. Il peut corrompre la mémoire et ailleurs dans l'espace d'adressage du processus.Ne pas utiliser les variables non initialisées, et envisager de transformer votre des avertissements du compilateur aussi élevé que possible; le compilateur peut intercepter des erreurs de ce type et d'émettre une alerte.
OriginalL'auteur cdhowie
Au lieu d'utiliser *nom, *le mot de passe,.. l'utilisation du nom[100], le mot de passe[100],... Si vous voulez le nom, mot de passe, .. pour être un pointeur alors allouer de la mémoire avec malloc ou calloc avant l'appel de scanf.
OriginalL'auteur Viswesn