2012-11-18 4 views
0

J'ai une structure en C, et j'utilise une fonction pour obtenir les valeurs de la structure de l'utilisateur. Voici ma structure.C Structures Erreur de bus 10

typedef struct { 
    char *name; 
    char *chemical_symbol; 
    char *class; 
    int  atomic_number; 
    double atomic_weight; 
    int  *electrons; 
} element_t; 

C'est la fonction que j'utilise pour obtenir les valeurs de l'utilisateur. Le problème réside dans cette fonction après avoir demandé le symbole chimique. Je reçois erreur de bus: 10. Ma compréhension d'une erreur de bus est quand le processeur ne peut pas tenter l'accès à la mémoire. Toute aide est appréciée. Je vous remercie!

element_t scan_element() { 

    element_t element; 

    printf ("Enter New Element Information:\n\n"); 

    printf("Element Name: "); 
    scanf("%s", element.name); 

    printf("Element Chemical Symbol: "); 
    scanf("%s", element.chemical_symbol); 

    printf("Element Class: "); 
    scanf("%s", element.class); 

    printf("Element Atomic Number: "); 
    scanf("%d", &element.atomic_number); 

    printf("Element Atomic Weight: "); 
    scanf("%lf", &element.atmoic_weight); 

    printf("Element Electrons: "); 
    scanf("%p", &element.electrons); 

    return(element); 
} 

Répondre

4
printf("Element Name: "); 
scanf("%s", element.name); 

Vous avez à allouer de la mémoire pour l'objet pointé par element.name par exemple en utilisant malloc. Sans allocation appropriée element.name est un pointeur invalide.

2

Vous n'avez pas alloué suffisamment de mémoire pour tenter de lire dans vos chaînes.

BTW, votre dernier scanf est étrange: vous voulez vraiment demander une adresse? Cela pourrait être dangereux.

0

Avant de numériser les chaînes, vous devez leur attribuer un espace. Par exemple:

void initialize(element_t * p) { 
    p->name = malloc(sizeof(char) * MAXSIZE); 
    p->chemical_symbol = malloc(sizeof(char) * MAXSIZE); 
    p->class = malloc(sizeof(char) * MAXSIZE); 
} 

Avant d'appeler scan_element, appelez initialize. Je suis sûr qu'il compilera correctement.

+0

N'oubliez pas de chaînes 'free()' après que vous avez terminé de les utiliser. – milleniumbug

2

Vous devez allouer de la mémoire. Peut-être que le meilleur (certainement plus facile!) Est simplement définir votre structure pour avoir des tableaux de caractères (au lieu de pointeurs de caractères).

Exemple:

#define MAX_STRING 80 
#define MAX_ELECTRONS 32 

typedef struct { 
    char name[MAX_STRING]; 
    char chemical_symbol[MAX_STRING]; 
    char class[MAX_STRING]; 
    int  atomic_number; 
    double atmoic_weight; 
    int  electrons[MAX_ELECTRONS]; 
} element_t;