動態申請記憶體

2021-06-22 21:03:23 字數 882 閱讀 7834

如果函式的引數是乙個指標,不要指望用該指標去申請動態記憶體。示例1中,test函式的語句getmemory(str, 100)並沒有使str獲得期望的記憶體,str依舊是null,為什麼? 

void getmemory(char *p, int num)

void test(void)

示例1 

試圖用指標引數申請動態記憶體 

毛病出在函式getmemory中。編譯器總是要為函式的每個引數製作臨時副本,指標引數p的副本是 _p,編譯器使 _p = p。如果函式體內的程式修改了_p的內容,就導致引數p的內容作相應的修改。這就是指標可以用作輸出引數的原因。在本例中,_p申請了新的記憶體,只是把_p所指的記憶體位址改變了,但是p絲毫未變。所以函式getmemory並不能輸出任何東西。事實上,每執行一次getmemory就會洩露一塊記憶體,因為沒有用free釋放記憶體。

如果非得要用指標引數去申請記憶體,有兩種方法:

1.指向指標的指標,見示例2

void getmemory2(char **p, int num)

void test2(void)

示例2 

用指向指標的指標申請動態記憶體

2.由於

「指向指標的指標」這個概念不容易理解,我們可以用函式返回值來傳遞動態記憶體。這種方法更加簡單,見示例3 

char *getmemory3(int num)

void test3(void)

示例3 

用函式返回值來傳遞動態記憶體

3.示例2中,申請記憶體與賦值的操作在不同函式中。如果要將兩者放在同一函式中,應如何處理?見示例4

void getmemory2(char **p, int num)

void test2(void)

示例4申請記憶體的同時進行賦值

malloc動態申請記憶體

1 malloc概述 malloc num 動態申請num位元組的記憶體空間,函式申請成功返回記憶體的起始位址 void型 申請不成功返回null指標,malloc不初始化記憶體空間 calloc type,num 函式會初始化申請的記憶體空間為0 使用完申請的記憶體後需要用free p 釋放記憶體...

記憶體與指標 動態申請記憶體

1 malloc 標頭檔案malloc.h 一維記憶體申請 型別識別符號 變數 變數名 型別識別符號 malloc sizeof 型別識別符號 陣列大小 二維記憶體申請 型別識別符號 變數 變數名 型別識別符號 malloc sizeof 型別識別符號 陣列行大小 for int i 0 i 陣列行...

c 的動態申請記憶體

一維陣列動態申請,c陣列大小為 n int c new int n 二維陣列動態申請,b陣列大小為 n p int b new int n for int i 0 ib i new int p 三維陣列動態申請,a陣列大小為 m n p int a new int m for i 0 i另外,當不再...