1

いくつかのサンプルパーツの構造体の配列を設定しようとしています。これらのパーツはファイルに出力する必要があります。正常に動作しているように見えますが、最初の3つの部分のみが印刷され、その後クラッシュします。

    #include "stdio.h"

main()
{
struct stock{
    char name[20];
    int partNum;
    int quantity;
};

struct stock someStock[3];

strcpy(someStock[0].name, "License plate");
someStock[0].partNum = 1234;
someStock[0].quantity= 4;

strcpy(someStock[1].name, "Head lamp");
someStock[1].partNum = 1111;
someStock[1].quantity= 2;

strcpy(someStock[2].name, "Rear wiper");
someStock[2].partNum = 2222;
someStock[2].quantity= 6;

strcpy(someStock[3].name, "Tyres");
someStock[3].partNum = 3333;
someStock[3].quantity= 10;

struct stock *ptr = &someStock[0];
int i;
FILE *file_ptr;
file_ptr = fopen("stock.dat", "w");

for(i=0;i<4;i++)
{
    fprintf(file_ptr, "%s %d %d\n",(*ptr).name,(*ptr).partNum, (*ptr).quantity);
    ptr++;
}

fclose(file_ptr);
return 0;

}
4

3 に答える 3

4
struct stock someStock[3];

3の配列を宣言しstruct stockますが、4つを使用しています。括弧内の数字は要素の数であり、有効な最高のインデックスではありません。宣言する

struct stock someStock[4];
于 2012-11-21T13:22:59.040 に答える
1

他の人が言ったように:

struct stock someStock[4];

あなたのための他のいくつかのヒント:

struct stock *ptr = &someStock[0];

と同等です:

struct stock *ptr = someStock;

ダニエルが指摘したように、これは、配列名がそのコンテキストの最初の要素へのポインターに評価されるためです。

と:

fprintf(file_ptr, "%s %d %d\n",(*ptr).name,(*ptr).partNum, (*ptr).quantity);

と同等です:

fprintf(file_ptr, "%s %d %d\n", ptr->name, ptr->partNum, ptr->quantity);

->構造体ポインター演算子.として知られています。これは、構造体メンバー演算子であるとは対照的に、ポインターを逆参照し、メンバーにオールインでアクセスするため、ポインターがある場合は間接演算子 も必要*です。

于 2012-11-21T13:29:16.160 に答える
0

struct stock someStock [3]; 配列に3つの要素があるため、配列のインデックスは0から2になる可能性があるため、strcpy(someStock [3] .name、 "Tyres"); 3が範囲外の配列インデックスであるため、プログラムがクラッシュしています

于 2012-11-21T13:24:26.797 に答える