0

これが私が書いたコードで、リンクリストに人の名前を追加します。これらの名前を表示しようとすると問題が発生します。名前を印刷する代わりに、私のコードはジャンク文字を印刷します。

struct node
{
 char name1[5];
 struct node *link;
};


void add(struct node **q,char *name)
{
 struct node *temp,*r;
 if(*q==NULL)
 {
             temp=malloc(sizeof(struct node));
             *temp->name1=name;
             temp->link=NULL;
             *q=temp;
             count++;
 }
 else
 {
     count++;
     temp=*q;
     while(temp->link !=NULL)
     temp=temp->link;

     r=malloc(sizeof(struct node));
     *r->name1=name;
     r->link=NULL;
     temp->link=r;
 }    

} 



void display(struct node *q)
{
    while(q!=NULL)
     {
      printf("%s",q->name1);  //it prints junk characters
      q=q->link;
      }                   

}     
int main()
{
    struct node *p;
    p=NULL;

    add(&p,"Alice");
    add(&p,"Cat");
    add(&p,"Pawan");
    add(&p,"BoB");

    display(p);
    getch();
    return 0;
}               
4

2 に答える 2

2

これ:

*temp->name1=name;

あなたが期待することはまったくしません。文字列のアドレスを文字に変換しname、最初の文字temp1->name1をその値に設定します。

この不適切な変換により、コンパイラの警告が生成されるはずです。コンパイラで可能なすべての警告を有効にして、それらを修正してください。

コードを修正するには、文字列データを実際にコピーする必要があります。

strcpy(temp->name1, name);

nameがサポートされているよりも長い場合name1、つまり 4 文字を超えて終了文字が 0 の場合、これは非常に危険であることに注意してください。以下を使用して、より安全にすることができます。

strlcpy(temp->name1, name, sizeof temp->name1);

あなたがそれを持っている場合、または

snprintf(temp->name1, sizeof temp->name1, "%s", name);

あなたがそれを持っている場合。

于 2013-02-20T13:30:15.610 に答える
1

char name1[5]配列が小さすぎます。「Alice」は終了 NUL のため 6 文字ですが、配列は 5 文字しかないため、C 用語で未定義の動作が発生します。unwind が指摘しているように、追加の逆参照バグもあり、*temp->name1おそらくtemp->name1.

于 2013-02-20T13:31:50.237 に答える