C語言中的動態記憶體分配詳解

2021-06-29 11:32:07 字數 1933 閱讀 3602

c語言中最難也最重要的要數指標這一章了,對指標的熟練程度決定了你對

c語言的學習的好壞程度,筆者自己在學習

c語言時,在指標上花費的時間幾乎等於學習其他基礎知識的時間,所以,對指標這一章有著自己獨特的見解和學習方法。

指標,簡單來說其作用就是用來操作記憶體的,而c

語言中動態記憶體分配就是一大難點,所以我今天特別來講一下關於動態記憶體分配的問題,先給出**:

#include

#include

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用於指向新分配的記憶體的位址,

old14

行,將head

和new

,old

都被賦值給第一次分配的記憶體的位址,算是對指標變數的初始化吧,接下來給記憶體空間賦值,然後就是動態記憶體的核心部分,也算是比較難以理解的部分吧,定義乙個全域性變數

count

用於計數分配記憶體的次數,在這個

while 

迴圈中,預設了輸入的學生的

id不能為零,如果為零,則會跳出迴圈,結束程式,否會則繼續執行。迴圈中,先給

count

自加一,表示已經分配了一次記憶體空間,然後對

count

進行判斷,當

count=1

時,由於前面只分配了一次記憶體,所以不存在新舊記憶體之分,故只用給分配的記憶體中的

next

值賦為空,即使末結點指向為空,由於上面已經對

old和

head

已經初始化,故在此不需要對其再次進行賦值操作。當

if語句執行完後,就再次進行記憶體分配操作,接著,由於

count

自加,count

已經大於

1,所以會執行

else

後面的語句,先對新分配的記憶體中的

next

賦值,使其指向為空,即如上的,每次使末節點指向為空,然後,將

old的

next

指向新分配的記憶體空間的頭結點,這就是煉錶鏈的部分。然後,將

new的值賦給

old,算是新老交換把,這裡比較難以理解,建議讀者可以找張紙畫一畫,就可以理解了。

C語言中動態記憶體分配

c語言用了蠻久了,最近在寫乙個dsp的程式,發現動態記憶體使用這一塊還是很欠缺,於是又重新看了看c的書,總結一下。之前常見的陣列或結構體內存分配,其長度必須是固定的常數,如 int a 10 等,當需要申請變長陣列時,常規的直接定義就不可以了,如float b n 其中n為變數 好像c99之後可以這...

C語言中的動態記憶體分配

目錄 什麼是記憶體的動態分配?怎樣建立記憶體的動態分配?用malloc函式開闢動態儲存區 用calloc函式開闢動態儲存區 用realloc函式重新分配動態儲存區 用free函式釋放動態儲存區 void指標型別 全域性變數是分配在記憶體中的靜態儲存區的,非靜態的區域性變數 包括形參 是分配在記憶體中...

C語言 動態記憶體分配詳解

c語言 動態記憶體分配詳解 動態記憶體分配涉及到堆疊的概念程式設計客棧 堆疊是兩種資料結構。堆疊都程式設計客棧是資料項按序排列的資料結構,只能在一端 稱為棧頂 top 對資料項進行插入和刪除。棧 作業系統 由作業系統自動分配釋放 www.cppcns.com,存放函式的引數值,區域性變數的值等。其操...