C语言中的动态内存分配详解

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行,将headNewOld都被赋值给第一次分配的内存的地址,算是对指针变量的初始化吧,接下来给内存空间赋值,然后就是动态内存的核心部分,也算是比较难以理解的部分吧,定义一个全局变量count用于计数分配内存的次数,在这个while 循环中,默认了输入的学生的id不能为零,如果为零,则会跳出循环,结束程序,否会则继续执行。循环中,先给count自加一,表示已经分配了一次内存空间,然后对count进行判断,当count=1时,由于前面只分配了一次内存,所以不存在新旧内存之分,故只用给分配的内存中的next值赋为空,即使末结点指向为空,由于上面已经对Oldhead已经初始化,故在此不需要对其再次进行赋值操作。当if语句执行完后,就再次进行内存分配操作,接着,由于count自加,count已经大于1,所以会执行else后面的语句,先对新分配的内存中的next赋值,使其指向为空,即如上的,每次使末节点指向为空,然后,将Oldnext指向新分配的内存空间的头结点,这就是链表链的部分。然后,将New的值赋给Old,算是新老交换把,这里比较难以理解,建议读者可以找张纸画一画,就可以理解了。

转载于:https://www.cnblogs.com/csdndreamer/p/5490679.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值