「名前」(文字列)フィールドによる構造体(CASE)の順序付きリストがあります。パラメータ「名前」(文字列)と「カウント」(整数)を持つ新しい構造体(ARTCOUNT)を作成したい。
構造体:
typedef struct
{
char* name;
char* art;
int rating;
}CASE;
typedef struct
{
char* name;
int count;
}ARTCOUNT;
CASE 配列を調べます。CASE の「名前」が ARTCOUNT の名前と一致する場合は、カウントに 1 を追加します。一致しない場合は、新しい名前で新しい ARTCOUNT 配列を作成し、配列を調べ続けます。
私が抱えている問題は、名前が一致する場合にカウントに追加しようとすると、奇妙なセグメンテーション違反です。
/*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 と出力しようとすると、やはりセグメンテーション エラーが発生します。メモリ割り当てを何度か確認しましたが、そうではないと思います。
任意のヒント?