11 2 分配記憶體

2021-10-03 07:41:54 字數 2156 閱讀 2020

這篇主要說一說c語言中幾個分配記憶體的函式:malloc(),calloc()free()

內容在書12.4章.

c語言可以通過庫函式分配和管理記憶體.下面的**都為變數分配了一些記憶體.

float f;

char str = "this is a string";

int arr[100];

靜態資料在程式載入記憶體時分配記憶體.自動資料程式執行**塊時分配,離開**塊時銷毀.

同時,c語言還可以在程式執行時分配更多的記憶體.

這個函式接收乙個引數: 需要分配的位元組數.

函式原型在stdlib.h中.

這個函式會找到合適的空閒記憶體塊分配記憶體,這樣的記憶體是匿名的,也就是通過malloc()函式分配的記憶體不會被賦名.不過通常要與下面介紹的free()函式一起使用.

返回值是動態分配的記憶體塊的首位元組位址.通常是指向char的指標.

ansi c標準開始,出現了新的型別:指向void的指標,相當於通用指標.將void指標賦給任意型別的指標不需要考慮型別匹配的問題.malloc()的返回值也從char*變為void*.

下面的**用malloc()函式建立了乙個容量為10的double陣列.

double* dp;

dp = (double*)malloc(10 * sizeof(double));

算上這種方式,現在有3種方法建立乙個陣列.

int arr[32];

宣告時用常量表示式表示陣列維度,用陣列名訪問陣列的元素.可以用靜態記憶體或動態記憶體建立這種陣列.

int base = 10;

int arr[2 * base];

c99新特性:宣告變成陣列,用變數表示式表示陣列的維度,用陣列名訪問陣列的元素.只能在自動記憶體中建立.

int* pi;

pi = (int)malloc(32 * sizeof(int));

宣告乙個指標,並用malloc()分配記憶體,將返回值賦值給指標,可以是靜態的也可以是自動的.

由於返回的是void*,所以通常需要強制型別轉換.

函式原型在stdlib.h中.

該函式的引數是malloc()函式返回的位址,以用來釋放malloc()分配的記憶體.所以動態記憶體的儲存期是從呼叫malloc()free()釋放記憶體為止.

需注意,free()只能釋放malloc()和後面提到的calloc()分配的記憶體.

free()應該位於程式的末尾,來釋放malloc()分配的記憶體.

注意,有些系統會紮起程式結束時自動釋放動態分配的記憶體,有些系統則不會.所以保險起見,無論什麼時候都要使用free().

int* p;

p = (int)malloc(32 * sizeof(int));

...free(p);

這個函式與前面提到的malloc()類似,ansi之前,返回char*,ansi之後,返回void*.

用法也一樣,首先定義乙個指標,再分配記憶體.不過引數有所不同.

int* p;

p = (int)alloc(32, sizeof(int));

// ↑所需的儲存單元數量 ↑每個單元的大小

15 分配記憶體失敗的考查

void test void 答 malloc後,應判斷 p是否null 這個題目自身有問題,深層次思考 出題人原意,free str 後,用str null杜絕野指標,但是這種寫法過於教科書化,離開這個函式,str都不能使用了,還搞個str null,不需要 在c 中,如果使用new,更不需要,參...

RQNOJ 140 分配時間

小王參加的考試是幾門科目的試卷放在一起考,一共給t分鐘來做。他現在已經知道每門科目花的時間和得到的分數的關係,還有寫名字要的時間 他寫自己的名字很慢 請幫他算一下他最高能得幾分。總分一定時,第一門科目成績盡量高,第一門科目成績也一樣時,第二門科目成績盡量高 以次類推。如果放棄某一門的考試 花的時間為...

luogu P4014 分配問題

關於構圖 首先,這是一道最小費用最大流和最大費用最大流 就是最小費用最大流,但建邊時的費用取負,就可以保證得到乙個最小的費用,再取反,就得到最大費用 的題目,比較裸。構圖 1.首先有乙個超級源點和匯點 st 0,ed 2 n 1。2.源點向每乙個人建一條流量為1,費用為0的邊,表示每乙個人只能選乙份...