2010-12-03 28 views
0

J'essaie d'écrire ce code, mais il me donne une erreur de segmentation après l'exécution du programme, pourriez-vous aider à trier?erreur de segmentation dans C

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

typedef struct{ 
    int salary; 
    char* name; 
} employee ; 

int main(){ 
    employee p[2]; 
     int i; 
     for(i=0;i<2; i++){ 
      printf("enter sal "); 
      scanf("%d", &p[i].salary); 

      printf("enter name "); 
      scanf("%s", &p[i].name); 
     } 
     for(i=0;i<2; i++){ 
      printf("p %d",p[i].salary); 
      printf("p %s",p[i].name); 
     } 
    return 0; 
} 

Répondre

1

Le champ de structure name est simplement un pointeur de caractère sauvage.

char* name; 

vous lisez l'entrée d'utilisateur comme:

scanf("%s", &p[i].name); 

dans la mémoire pointée par name qui pourrait être partout.

Pour résoudre ce problème, vous devez allouer dynamiquement la mémoire pointée par name ou vous pouvez changer name à un tableau char de la taille d'une plus grande que la longueur maximale du nom possible.

char name[MAX]; 
1

Vous n'avez pas besoin l'opérateur & quand scanf'ing à pointeur. Et vous devez malloc p[i].name

 scanf("%s", p[i].name); 
5
  • Vous devez allouer de la mémoire pour le champ Nom: p[i].name = (char*)malloc(MAX_NAME_LEN)
  • En outre, le scanf("%s", &p[i].name) devrait lire scanf("%s", p[i].name).
0

Vous avez oublié d'allouer de la mémoire pour p[i].name.

0

Vous avez à réserver de la mémoire pour le name membre de chaque instance de employee:

p[i].name = (char*)malloc(expected_max_size); 

juste avant la scanf pour cette variable. La déclaration d'un pointeur sur char char* n'attribue pas de mémoire à la chaîne pointée vers, mais seulement au pointeur lui-même, et dans votre exemple il n'est pas initialisé. En utilisant malloc, vous réservez un morceau de mémoire et faites pointer le pointeur dessus. Vous devez faire attention à la vérification des limites, car vous devez réserver la mémoire à l'avance, assez pour contenir ce que l'utilisateur écrit.

1

Vous n'allouez pas de mémoire pour le nom char *. changer votre structure de données pour

typedef struct 
{ 
    int salary; 
    char name[50]; 
} 

ou allouer de la mémoire à l'aide malloc

0

Vous devez allouer de la mémoire pour la chaîne « name » dans votre structure. Pour ce faire, utilisez malloc() ou en déclarant le nom comme un tableau d'une taille donnée (nom de char [SIZE]).