標籤:方法 d3d har images nbsp out lan ret size
參數策略
如果函數的參數是一個指標,不要指望用該指標去動態申請記憶體。如下:
void GetMemory(char *p, int num){ p = (char *)malloc(sizeof(char) * num);}void Test(void){ char *str = NULL; GetMemory(str, 100); //str仍未NULL strcpy(str, "hello"); //運行錯誤}
原因是編譯器總是為每個參數製作臨時副本。指標參數p, 其副本為_p,使_p=p。如果改變了_p所指的內容,相應的p所指的內容也跟著改變(畢竟指向同樣的地方)。但是在GetMemory中動態分配記憶體空間,改變了_p的內容。在調用函數中的p還是指向NULL。再者,因為函數GetMemory中動態分配了空間,但是沒釋放,這樣調用一次函數,就泄露了一次記憶體。圖示:
如果非得用指標參數申請記憶體,可以用指標的指標作為參數申請記憶體
void GetMemory(char **p, int num){ *p = (char *)malloc(sizeof(char) * num);}void Test(void){ char *str = NULL; GetMemory(&str, 100); //記得加地址符 strcpy(str, "hello"); free(str) }
原理是一樣的,比較難理解,圖示表示:
比較好的方法是傳指標的引用
#include <iostream>#include <string>#include <cstring>#include <cstdlib>using namespace std;void GetMemory(char *&p, int num){ p = (char *)malloc(sizeof(char) * num);}void Test(void){ char *str = NULL; GetMemory(str, 100); strcpy(str, "hello"); cout << str << endl; free(str);}int main(){ Test();}
這裡注意指標的引用 為char* &a,要是不好理解可以這樣:
typedef char* pchar;pchar &a
傳回值策略
可以用函數傳回值來傳遞動態記憶體。這中方法比“指標的指標”簡單多了
char *GetMemory(int num){ char *p = (char *)malloc(sizeof(char) * num); return p;}void Test(void){ char *str = NULL; str = GetMemory(100); //str指向了動態分配的空間 strcpy(str, "hello"); free(str) }
在使用傳回值時,千萬別返回指向“棧記憶體”的指標、引用,因為該記憶體在函數結束時自動消亡了,返回的指標是個野指標了。例如
char *GetString(){ char p[] = "hello world"; //數組內容儲存在棧區,函數結束時,會釋放掉 return p;}void Test(void){ char *str = NULL; str = GetString(); //因為非配的記憶體早已釋放掉,此時的str是個野指標,內容是垃圾 cout << str << endl; }
在函數中不定義數組,定義指標,樣本:
char *GetString(){ char *p = "hello world"; //數組內容儲存在靜態區,函數結束時,不會釋放掉 return p;}void Test(void){ char *str = NULL; str = GetString(); cout << str << endl; }
此時的程式是正確的,但是有一點,此時分配的記憶體處於靜態區,是只可以讀取但是不可以修改的。
原文路徑:http://www.cnblogs.com/kaituorensheng/p/3246900.html
【轉】【c++】指標參數是如何傳遞記憶體的