2012-04-24 7 views
1

"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と言って印刷しようとすると、まだセグメント化エラーが発生します。私は自分のメモリ割り当てを何度か点検しましたが、それはそれだとは思いません。

ヒント?

答えて

1

あなたは

ARTCOUNT* artWalker = artAll; 

を宣言し、それはあなたがセグメンテーション違反に

を得ることは驚くべきことではないですので、ランダムメモリ位置を指しているこの時点でartWalkerでartAll

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

を変更しました

割り当てを試してみてください

mallocの後に210

3
ARTCOUNT* artAll; 
ARTCOUNT* artWalker = artAll; 

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

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

+0

私はartWalkerを割り当てると問題はないと思っていました。私はartAllのためにメモリを割り当てたときにartAllである割り当てられた配列を指していませんか? – Huy

+1

@hyngynいいえ、 'artWalker'は' malloc'コールの後に 'artAll'の古い無効な値を持っています – ouah

+0

助けてくれてありがとう! – Huy

関連する問題