1

「名前」(文字列)フィールドによる構造体(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 と出力しようとすると、やはりセグメンテーション エラーが発生します。メモリ割り当てを何度か確認しましたが、そうではないと思います。

任意のヒント?

4

2 に答える 2

3
ARTCOUNT* artAll;
ARTCOUNT* artWalker = artAll;

if((artAll = (ARTCOUNT*)malloc(sizeof(ARTCOUNT)*(pLast-all+1))) == NULL)
{ /* ... */ }

宣言artAll後にメモリを割り当てています。無効な値で初期化されているartWalkerことを意味します。artWalker

于 2012-04-24T16:18:17.247 に答える
1

あなたが宣言した

ARTCOUNT* artWalker = artAll;

その後、artAllを変更しました

if((artAll = (ARTCOUNT*)malloc(sizeof(ARTCOUNT)*(pLast-all+1))) == NULL)

この時点で、artWalker はランダムなメモリ位置を指しているため、セグメンテーション エラーが発生しても驚くことではありません。

割り当ててみてください

artWalkr = artAll;

mallocの後。

于 2012-04-24T16:19:59.867 に答える