【轉】【c++】指標參數是如何傳遞記憶體的

來源:互聯網
上載者:User

標籤:方法   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++】指標參數是如何傳遞記憶體的

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.