C:链表打印垃圾字符

时间:2013-02-20 13:28:30

标签: c

这是我写的一段代码,它在链接列表中添加了人员的名字。当我试图显示这些名称时,问题就出现了。而不是打印名称,我的代码打印垃圾字符 代码...

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;
}               

2 个答案:

答案 0 :(得分: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);

如果你有。

答案 1 :(得分:1)

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