"name"(文字列)フィールドで構造体の順序付きリスト(CASE)があります。私はパラメータ "名前"(文字列)と "カウント"(整数)を持つ新しい構造体(ARTCOUNT)を作成したいと思います。1つの構造体から別の構造体にデータをコピーしようとするとセグメンテーションエラーが発生する
構造体:
typedef struct
{
char* name;
char* art;
int rating;
}CASE;
typedef struct
{
char* name;
int count;
}ARTCOUNT;
私はCASE配列を歩いていくとCASEの「名前」はARTCOUNTの名前と一致する場合、私は他の私が使用して新しいARTCOUNTの配列を作成しますが、数に1を追加します新しい名前と配列を歩いて続ける。
問題は、名前が一致するとカウントに追加しようとすると、奇妙なセグメンテーション違反です。上記のコードで述べたように
/*all is the array of CASE and pLast points to the last CASE in all*/
void countArt(CASE* all, CASE* pLast)
{
CASE* walker = all;
ARTCOUNT* artAll;
ARTCOUNT* artWalker = artAll;
ARTCOUNT* artLast;
if((artAll = (ARTCOUNT*)malloc(sizeof(ARTCOUNT)*(pLast-all+1))) == NULL)
{
printf("Fatal memory error!\n");
exit(1);
}
artWalker->name = (char*)malloc(sizeof(char)*(100));
strcpy(artWalker->name, walker->name);
artWalker->count = 1;
for(walker = all+1; walker <= pLast; walker++)
{
if (strcmp(walker->name, artWalker->name) == 0)
{
artWalker->count += 1;
}
else
{
artWalker++;
artWalker->name = (char*)malloc(sizeof(char)*(100));
strcpy(artWalker->name, walker->name);
artWalker->count = 1; //if I comment this out, no segmentation fault
}
}
artLast = artWalker;
return;
}
は、私はラインartWalker->count-1;
にエラーが何であるかを絞り込むことができました。私がこの行をコメントアウトすると、エラーは消えます。しかし、ループ内にartWalker-> nameと言って印刷しようとすると、まだセグメント化エラーが発生します。私は自分のメモリ割り当てを何度か点検しましたが、それはそれだとは思いません。
ヒント?
私はartWalkerを割り当てると問題はないと思っていました。私はartAllのためにメモリを割り当てたときにartAllである割り当てられた配列を指していませんか? – Huy
@hyngynいいえ、 'artWalker'は' malloc'コールの後に 'artAll'の古い無効な値を持っています – ouah
助けてくれてありがとう! – Huy