0

私は C で stuct を持っており、関数を使用してユーザーから構造体の値を取得しています。以下は私の構造です。

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

これは、ユーザーから値を取得するために使用している関数です。問題は、化学記号を要求した後のこの関数にあります。Bus Error: 10 が表示されます。バス エラーについての私の理解は、プロセッサがメモリ アクセスを試行できない場合です。どんな助けでも大歓迎です。ありがとうございました!

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);
}
4

4 に答える 4

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

element.nameたとえば、 を使用して、 が指すオブジェクトにメモリを割り当てる必要がありますmalloc。適切な割り当てelement.nameがないと、無効なポインターになります。

于 2012-11-18T17:36:42.230 に答える
2

文字列を読み取ろうとするのに十分なメモリが割り当てられていません。

ところで、あなたの最後scanfは奇妙です: 本当に住所を聞きたいですか? 危険な場合があります。

于 2012-11-18T17:36:58.957 に答える
2

メモリを割り当てる必要があります。おそらく最良の (確かに最も簡単な!) 方法は、(文字ポインターの代わりに) 文字配列を持つように構造体を定義することです。

例:

#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;
于 2012-11-18T17:43:14.113 に答える
0

文字列をスキャンする前に、文字列にスペースを割り当てる必要があります。例えば:

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

に電話する前にscan_element、 に電話してinitializeください。私はそれが正しくコンパイルされると確信しています。

于 2012-11-18T17:43:09.087 に答える