malloc函式及用法

2021-08-02 20:33:09 字數 1775 閱讀 1310

吸收和補充:

動態儲存分配

在陣列一章中,曾介紹過陣列的長度是預先定義好的,在整個程式中固定不變。c語言中不允許動態陣列型別。

例如:int n;

scanf("%d",&n);

int a[n];

用變數表示長度,想對陣列的大小作動態說明,這是錯誤的。但是在實際的程式設計中,往往會發生這種情況,即所需的記憶體空間取決於實際輸入的資料,而無法預先確定。對於這種問題,用陣列的辦法很難解決。為了解決上述問題,c語言提供了一些記憶體管理函式,這些記憶體管理函式可以按需要動態地分配記憶體空間,也可把不再使用的空間**待用,為有效地利用記憶體資源提供了手段。

常用的記憶體管理函式有以下三個:

1. 分配記憶體空間函式malloc

呼叫形式:

(型別說明符*)malloc(size)

功能:在記憶體的動態儲存區中分配一塊長度為"size"位元組的連續區域。函式的返回值為該區域的首位址。

「型別說明符」表示把該區域用於何種資料型別。

(型別說明符*)表示把返回值強制轉換為該型別指標。

「size」是乙個無符號數。

例如:pc=(char *)malloc(100);

表示分配100個位元組的記憶體空間,並強制轉換為字元陣列型別,函式的返回值為指向該字元陣列的指標,把該指標賦予指標變數pc。

2. 分配記憶體空間函式 calloc

calloc 也用於分配記憶體空間。

呼叫形式:

(型別說明符*)calloc(n,size)

功能:在記憶體動態儲存區中分配n塊長度為「size」位元組的連續區域。函式的返回值為該區域的首位址。

(型別說明符*)用於強制型別轉換。

calloc函式與malloc 函式的區別僅在於一次可以分配n塊區域。

例如:ps=(struet stu*)calloc(2,sizeof(struct stu));

其中的sizeof(struct stu)是求stu的結構長度。因此該語句的意思是:按stu的長度分配2塊連續區域,強制轉換為stu型別,並把其首位址賦予指標變數ps。

3.釋放記憶體空間函式free

呼叫形式:

free(void*ptr);

功能:釋放ptr所指向的一塊記憶體空間,ptr是乙個任意型別的指標變數,它指向被釋放區域的首位址。被釋放區應是由malloc或calloc函式所分配的區域。

【例】分配一塊區域,輸入乙個學生資料。

#include

#include

main()

*ps;

ps=(struct stu*)malloc(sizeof(struct stu));

ps->num=102;

ps->name="zhang ping";

ps->str='m';

ps->score=62.5;

printf("number=%d\nname=%s\n",ps->num,ps->name);

printf("***=%c\nscore=%f\n",ps->str,ps->score);

free(ps);

} 本例中,定義了結構stu,定義了stu型別指標變數ps。然後分配一塊stu大記憶體區,並把首位址賦予ps,使ps指向該區域。再以ps為指向結構的指標變數對各成員賦值,並用printf輸出各成員值。最後用free函式釋放ps指向的記憶體空間。整個程式包含了申請記憶體空間、使用記憶體空間、釋放記憶體空間三個步驟,實現儲存空間的動態分配。

malloc函式及用法

動態儲存分配 在陣列一章中,曾介紹過陣列的長度是預先定義好的,在整個程式中固定不變。c語言中不允許動態陣列型別。例如 int n scanf d n int a n 用變數表示長度,想對陣列的大小作動態說明,這是錯誤的。但是在實際的程式設計中,往往會發生這種情況,即所需的記憶體空間取決於實際輸入的資...

malloc函式及用法

動態儲存分配 在陣列一章中,曾介紹過陣列的長度是預先定義好的,在整個程式中固定不變。c語言中不允許動態陣列型別。例如 int n scanf d n int a n 用變數表示長度,想對陣列的大小作動態說明,這是錯誤的。但是在實際的程式設計中,往往會發生這種情況,即所需的記憶體空間取決於實際輸入的資...

malloc函式用法

void malloc int size 說明 malloc向系統申請分配size位元組的記憶體空間,返回型別為void 型別。int p p int malloc sizeof int 注意 1 因為malloc返回的是不確定型別的指標,所以返回之前必須經過型別強制轉換,否則編譯報錯,如 不能將v...