C语言链表与malloc函数

// 分配内存空间.cpp : 定义控制台应用程序的入口点。
//

#include "stdio.h"
#include "malloc.h"
struct Student
{
    int id;
    char *name;
    int score;
    struct Student *next;
};

void errorFun()
{
    struct Student stu={1,"wq",99};
    struct Student *head,*s1;
    for(int i=0;i<3;i++)
    {        
        //这一句,只在第一次执行的时候给s分配了内存地址,第一次以后执行都是用相同的内存地址,也就是说从第一次循环过后每次都是给同一个内存段设置值,之后后来的值会覆盖之前的值,所以建立链表错误
        struct Student s,*s2;
        s.id=i;
        s.name="学生";
        s.score=i*10;
        s2=&s;
        if(i==0)
        {
            head=&s;
            s1=head;
        }else
        {
            s1->next=s2;
            s1=s2;
        }
    }
    //代码运行到这里的时候,无论是head,s1还是s2都是指向一个地址的指针,而且它们指向的结构体的next其实是指向本身,这就进入了一个死循环
    s1->next=NULL;
    printf("学号:%d,姓名:%s,成绩:%d\n",stu.id,stu.name,stu.score);
}
void sucessFun()
{
    struct Student stu={1,"wq",99};
    struct Student *head,*s1;
    
    for(int i=0;i<3;i++)
    {    
        //在这里动态分配内存,就不会有上面的Bug了
        struct Student *s2=(struct Student *)malloc(sizeof(struct Student));
        (*s2).id=i;
        s2->name="学生";
        s2->score=i*10;
        
        if(i==0)
        {
            head=s2;
            s1=head;
        }else
        {
            s1->next=s2;
            s1=s2;
        }
    }
    s1->next=NULL;
    //循环链表
    Student *temp=head;
    while(temp!=NULL)
    {
        printf("学号:%d,姓名:%s,成绩:%d\n",temp->id,temp->name,temp->score);
        temp=temp->next;
    }
    
    //printf("学号:%d,姓名:%s,成绩:%d\n",stu.id,stu.name,stu.score);
}
void main()
{
    //errorFun();
    sucessFun();
}
posted @ 2010-09-02 23:58  再快一点  阅读(4072)  评论(0编辑  收藏  举报