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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM