这是我写的一段代码,它在链接列表中添加了人员的名字。当我试图显示这些名称时,问题就出现了。而不是打印名称,我的代码打印垃圾字符 代码...
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;
}
答案 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
。