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,算是新老交換把,這里比較難以理解,建議讀者可以找張紙畫一畫,就可以理解了。