快跟“動態記憶體分配方式”熟絡起來鴨
內容摘要:
分配的方式分為動態靜態兩種,本文著重闡述動態,並引申與靜態的對比,在此之前會先介紹關於動態分配方式的定義、運用、 。
關鍵字:
動態分配方式、靜態分配方式、儲存空間、分配方式、堆上分配、棧上分配。
目錄索引:
一.定義、二.運用、三.申請與釋放的剖析、四.與靜態記憶體分配的區分與比較
正文:
一. 定義:
(一)動態記憶體分配方式:
指在程式執行的過程中動態地分配或者回收記憶體空間的分配記憶體空間的方法。
(二)個人理解:
也就是以堆上分配的方式(記憶體由人工申請並且釋放),程式執行時人為的通過malloc函式來進行記憶體大小的申請,使用之後由通過free函式來釋放記憶體。
二. 運用:
(一)解密英文藏頭詩
程式碼實現:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int i, n = 0;
char *s[100], str[100];
char e;
scanf("%c",&e);
while(e!='\n')
{
if(e!=' ')
{
str[i]=e;
i++;
}
scanf("%c",&e);
}
i=0;
while(str[0] != '#')
{
s[n] = (char *) malloc( sizeof(char) * ( strlen(str) + 1 ));
strcpy(s[n], str);
n++;
scanf("%c",&e);
while(e!='\n')
{
if(e!=' ')
{
str[i]=e;
i++;
}
scanf("%c",&e);
}
i=0;
}
for(int i =0; i < n; i++)
{ char ss[110];
strcpy(ss, s[i]);
printf("%c", ss[0]);
free(s[i]);
}
return 0;
}
演示:
輸入內容:
輸出內容:
三.申請與釋放的剖析
(一)malloc函式
1.意義:
如上文所提到的動態記憶體分配之中就包括“輸入”時用到malloc函式,可以說malloc時動態記憶體分配的前提,是申請的過程。
2.格式:
1.需要引用標頭檔案#include<stdlib.h>
2.void*malloc(unsighn long size)
3.特點:
malloc函式返回的是地址,這個地址就是動態分配的記憶體空間的起始地址,型別具體為viod*。
4.程式碼實現:
int*p=malloc(4);
(二)free函式
1.意義:
2.程式碼實現:
# include <stdlib.h> void free(void *p);
3.特點:
free函式無返回值,釋放指標變數p所指的記憶體單元。
四.與靜態記憶體分配的區分與比較
靜態記憶體也就是棧上分配(與堆上分配相對的分配方式,如陣列,一旦定義了陣列長度,之後便不可更改長度值),其實還包括形參、函式呼叫、區域性變數,我們程式大多都是棧上分配。
(一)特點:
相對的,該方式記憶體是由系統分配並且釋放。
(二)以陣列為例:
靜態分配下的陣列的劣勢:
1.陣列長度不能是變數。
2.在一個函式中定義的陣列只能在該函式中執行。
謝謝觀看