***
- 最近在用链表写管理学生信息的程序,遇到了一个大问题,由于对c语言的基本知识了解不够扎实,该bug改了好几天,后来才醒悟,总而言之一句话,若结构体内的成员有指针类型时,一定要对这个指针malloc,不管有没有对整个结构体malloc,否则程序会跑飞。废话不多说,先上代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct student{
char *pnum;
char *pname;
float math;
float clg;
float ave;
struct student *next;
}Node,*LNode;
int main()
{
LNode head;
head=(LNode)malloc(sizeof(Node));
head->next=NULL;
char choose;
LNode stu;
LNode rear=(LNode)malloc(sizeof(Node));
rear=head;
printf("开始输入吗(y\\n)\n");
scanf("%c",&choose);
getchar();
while(choose!='n')
{
stu=(LNode)malloc(sizeof(Node));
/*stu->pnum=(char*)malloc(20);
stu->pname=(char *)malloc(20);*/
printf("请输入学生的学号:\n");
scanf("%s",stu->pnum);
printf("请输入学生的姓名:\n");
scanf("%s",stu->pname);
printf("请输入学生的数学成绩(0-100):\n");
scanf("%f",&stu->math);
printf("请输入学生的c语言成绩(0-100):\n");
scanf("%f",&stu->clg);
getchar();
stu->ave=(stu->math+stu->clg)/2;
stu->next=rear->next;
rear->next=stu;
rear=stu;
printf("还要继续输入吗?(y\\n)\n");
scanf("%c",&choose);
getchar();
}
rear->next=NULL;
return 0;
}
程序运行后,在输入第一个学生信息后想继续输入时,程序直接崩溃,原因就是虽然对结构体指针stu进行了malloc,但是未对结构体内部的两个指针成员pnum和pname进行malloc,然后就对其进行了scanf操作,这相当于没有对指针进行初始化就使用指针,这是非常危险的事情,虽然编译会通过,但是程序会崩溃掉。
改进的方式为`
stu->pnum=(char*)malloc(20);
stu->pname=(char *)malloc(20);
这两句代码。
当然,也可以将字符串指针改为数组,即:
typedef struct student{
char pnum[20];
char pname[20];
float math;
float clg;
float ave;
struct student *next;
}Node,*LNode;
这样便可以只对结构体malloc。