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]的数组太小了。由于终止 NUL,“Alice”是 6 个字符,但您的数组只有 5 个字符,导致 C 语言中的未定义行为。正如 unwind 指出的那样,还有一个额外的取消引用错误,*temp->name1其中可能应该是temp->name1.

于 2013-02-20T13:31:50.237 回答