结构中的指针奇怪的结果

时间:2014-01-25 19:38:26

标签: c pointers semantics

- 下面给出的程序从输入文件中的信息中添加一个带有id,标记和名称的学生节点。

- 使用addToList()

创建这些学生的链接列表
#include<stdio.h>
#define MAXLINE 10
struct student{
    int id;
    char *name;
    int marks;
    struct student *next;
    struct student *tail;
};

void addToList(int id,char *name,int marks,struct student *head){
    struct student *node=(struct student *)malloc(sizeof(struct student));
    node->id=id;
    node->name=name;
    node->marks=marks;
    node->next=NULL;
    head->tail->next=node;
    head->tail=node;
    printf("%d %s %d\n",head->id,head->name,head->marks);
}
int main(){
    FILE *fp=fopen("C:/Users/Johny/Desktop/test.txt","r");
    int id,marks;
    char f,name[MAXLINE];
    struct student *head;
    f=fscanf(fp,"%d %s %d",&id,name,&marks);
    if(f!=EOF){
        head=(struct student *)malloc(sizeof(struct student));
        head->id=id;
        head->marks=marks;
        head->name=name;
        head->next=NULL;
        head->tail=head;
    }
    printf("%d %s %d\n",head->id,head->name,head->marks);
    while((f=fscanf(fp,"%d %s %d",&id,name,&marks))!=EOF)
        addToList(id,name,marks,head);
    return 0;

输入文件:

1 "J" 36
2 "O" 40
3 "H" 23
4 "N" 39
5 "Y" 78

正确的输出

1 "J" 36
1 "J" 36
1 "J" 36
1 "J" 36
1 "J" 36

当前输出

1 "J" 36
1 "O" 36
1 "H" 36
1 "N" 36
1 "Y" 36

结构名称字段发生了什么?为什么只有这个改变?头指针指向链表的第一个节点。预期的输出必须是正确的输出。

1 个答案:

答案 0 :(得分:0)

错误是您没有复制,而是将name的地址分配给node->name。因此,所有节点的名称字段都指向您在main中声明为name的{​​{1}}的相同字符串。

因为在添加功能时,您正在打印指向char name[MAXLINE];的{​​{1}},而head->name中的值是最后从文件中读取的字符串。因此,name只打印从文件读取的最后一个字符串,name打印字符串head->namehead->name j ....

要纠正它,您应该明确地分配内存和o,如下所示。

h