C语言中的动态内存分配详解
C语言中最难也最重要的要数指针这一章了,对指针的熟练程度决定了你对C语言的学习的好坏程度,笔者自己在学习C语言时,在指针上花费的时间几乎等于学习其他基础知识的时间,所以,对指针这一章有着自己独特的见解和学习方法。
指针,简单来说其作用就是用来操作内存的,而C语言中动态内存分配就是一大难点,所以我今天特别来讲一下关于动态内存分配的问题,先给出代码:
#include<stdio.h>
#include<stdlib.h>
struct student
{
int id;
char name[20];
float score;
struct student *next;
};
int count=0;
void main()
{
struct student *head,*New,*Old;
head=New=Old=(struct student *)malloc(sizeof(struct student));
printf("请输入学号,姓名和分数(空格隔开):");
scanf("%d %s %f",&New->id,New->name,&New->score);
while(New->id!=0)
{
while(New->id!=0)
{
count++;
if(count==1)
New->next=NULL;
else
{
New->next=NULL;
Old->next=New;
Old=New;
}
New=(struct student *)malloc(sizeof(struct student));
printf("请输入学号,姓名和分数(空格隔开):");
scanf("%d %s %f",&New->id,New->name,&New->score);
}
free(New);
}
代码分析:
由于过程中要使用malloc函数,故先要导入stdlib.h这个头文件,然后先定义指向结构体变量的指针,head用于指向链表的头结点,New用于指向新分配的内存的地址,Old用于指向新分配的内存的上一个内存的地址,代码14行,将head和New,Old都被赋值给第一次分配的内存的地址,算是对指针变量的初始化吧,接下来给内存空间赋值,然后就是动态内存的核心部分,也算是比较难以理解的部分吧,定义一个全局变量count用于计数分配内存的次数,在这个while 循环中,默认了输入的学生的id不能为零,如果为零,则会跳出循环,结束程序,否会则继续执行。循环中,先给count自加一,表示已经分配了一次内存空间,然后对count进行判断,当count=1时,由于前面只分配了一次内存,所以不存在新旧内存之分,故只用给分配的内存中的next值赋为空,即使末结点指向为空,由于上面已经对Old和head已经初始化,故在此不需要对其再次进行赋值操作。当if语句执行完后,就再次进行内存分配操作,接着,由于count自加,count已经大于1,所以会执行else后面的语句,先对新分配的内存中的next赋值,使其指向为空,即如上的,每次使末节点指向为空,然后,将Old的next指向新分配的内存空间的头结点,这就是链表链的部分。然后,将New的值赋给Old,算是新老交换把,这里比较难以理解,建议读者可以找张纸画一画,就可以理解了。