青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-145  評論-173  文章-70  trackbacks-0

   如果函數的參數是一個指針,不要指望用該指針去申請動態內存。示例7-4-1中,Test數的語句GetMemory(str, 200)并沒有使str獲得期望的內存,str依舊是NULL,為什么?

 

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");   // 運行錯誤

}

示例7-4-1 試圖用指針參數申請動態內存

 

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

如果非得要用指針參數去申請內存,那么應該改用“指向指針的指針”,見示例7-4-2

 

void GetMemory2(char **p, int num)

{

    *p = (char *)malloc(sizeof(char) * num);

}

void Test2(void)

{

    char *str = NULL;

    GetMemory2(&str, 100); // 注意參數是 &str,而不是str

    strcpy(str, "hello");  

    cout<< str << endl;

    free(str); 

}

示例7-4-2用指向指針的指針申請動態內存

 

由于“指向指針的指 針”這個概念不容易理解,我們可以用函數返回值來傳遞動態內存。這種方法更加簡單,見示例7-4-3

 

char *GetMemory3(int num)

{

    char *p = (char *)malloc(sizeof(char) * num);

    return p;

}

void Test3(void)

{

    char *str = NULL;

    str = GetMemory3(100); 

    strcpy(str, "hello");

    cout<< str << endl;

    free(str); 

}

示例7-4-3 用函數返回值來傳遞動態內存

 

用函數返回值來傳遞動態內存這種方法雖然好用,但是常常有人把return語句用錯了。這里強調不要用return語句返回指向“棧內存”的指 針,因為該內存在函數結束時自動消亡,見示例7-4-4

 

char *GetString(void)

{

    char p[] = "hello world";

    return p;   // 編譯器將提出警告

}

void Test4(void)

{

char *str = NULL;

str = GetString(); // str 的內容是垃圾

cout<< str << endl;

}

示例7-4-4 return語句返回指向“棧內存”的指針

 

用調試器逐步跟蹤Test4,發現執行str = GetString語句后str不再是NULL指針,但是str的內容不是hello world而是垃圾。

如果把示例7-4-4改寫成示例7-4-5,會怎么樣?

 

char *GetString2(void)

{

    char *p = "hello world";

    return p;

}

void Test5(void)

{

    char *str = NULL;

    str = GetString2();

    cout<< str << endl;

}

示例7-4-5 return語句返回常量字符串

 

函數Test5運行雖然不會出錯,但是函數 GetString2的設計概念卻是錯誤的。因為GetString2內的“hello world”是常量字符串,位于靜態存儲區,它在程序生命期內恒定不變。無論什么時候調用GetString2,它返回的始終是同一個“只讀”的內存塊。

=======================================================================================================================================================================
原文的解釋是:
函數體內的程序修改了_p的內容 和 _p所指的內存地址改變了 是兩回事.前一句是指修改了_p所指的地址內的內容,而后一句是改變了地址.

    在test中 


str是指針變量,假設它的地址是1111h,里面的值就是NULL(0000h) 
getmemory(str,100)中傳入的是str的值也就是0000h 

在GetMemory中,p是一個指向字符的指針(在函數的臨時棧中),假設它的地址是1000h, 
再函數調用中出入的值是0000h,那么p這個變量中的值就是0000h 
在執行p   =   (char   *)malloc(sizeof(char)   *   num)后,p的值變為分配的堆內存,如1234H 

函數返回時,p因為是在函數棧中,隨著函數的結束,而失效 

str中的值還是0000h 【正解!】

參考資料:http://www.cublog.cn/u1/45525/showart_403028.html

posted on 2011-05-28 12:19 deercoder 閱讀(1893) 評論(0)  編輯 收藏 引用 所屬分類: C++
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美日韩一区二区在线 | 亚洲欧美三级伦理| 久久成人国产| 国产精品乱码久久久久久| 最新中文字幕一区二区三区| 久久久精品999| 亚洲综合电影| 国产精品免费一区二区三区在线观看| 99视频在线观看一区三区| 亚洲第一黄网| 久久精品国产精品| 国产欧美午夜| 久久久久久久综合| 久久精品国产一区二区电影| 韩国成人精品a∨在线观看| 久久精品论坛| 欧美中文字幕第一页| 亚洲美女视频在线免费观看| 亚洲免费观看高清在线观看| 久久夜色精品国产噜噜av| 午夜精品久久久久久久久久久| 国产精品影音先锋| 欧美中文字幕久久| 久久精品中文字幕免费mv| 黄色欧美成人| 亚洲缚视频在线观看| 欧美国产日产韩国视频| 国产精品99久久久久久人| 一区二区三区蜜桃网| 国产精品久久久久久久久免费桃花 | 91久久久久久国产精品| 亚洲国产小视频| 欧美三级欧美一级| 久久er精品视频| 久久这里有精品15一区二区三区 | 美女精品自拍一二三四| 欧美激情一二区| 亚洲一区二区免费视频| 欧美亚洲色图校园春色| 亚洲国产精品久久久久秋霞影院| 亚洲精品九九| 国产日韩精品在线观看| 欧美激情第8页| 国产精品女同互慰在线看| 久久影院午夜片一区| 欧美精品www在线观看| 午夜精品亚洲| 蜜桃av一区二区三区| 亚洲欧美一区二区三区极速播放| 欧美综合国产| 亚洲特级毛片| 老牛国产精品一区的观看方式| 正在播放亚洲一区| 久久精品视频播放| 亚洲一区二区三区四区五区午夜| 久久久不卡网国产精品一区| 国产精品99久久久久久宅男 | 99国产精品视频免费观看| 欧美亚洲在线视频| 亚洲一二三区精品| 欧美波霸影院| 久久久之久亚州精品露出| 国产精品www.| 亚洲国产天堂久久国产91| 国产日韩一区| 亚洲视频电影图片偷拍一区| 亚洲激情av| 久久精品夜色噜噜亚洲a∨| 亚洲一区二区高清视频| 欧美a级一区| 久久亚洲视频| 国产日韩欧美高清| 亚洲一级二级在线| 久久久精品国产免大香伊| 亚洲精品欧洲| 在线观看视频免费一区二区三区 | 久热这里只精品99re8久| 亚洲一区二区三区色| 欧美黑人多人双交| 欧美成在线观看| 激情亚洲网站| 久久精品99国产精品酒店日本| 欧美在线观看www| 国产精品亚发布| 日韩亚洲欧美高清| 夜夜精品视频一区二区| 欧美国产第一页| 最新国产成人在线观看| 日韩视频中文字幕| 欧美精品在线免费| 亚洲欧洲日产国产网站| 亚洲另类视频| 欧美理论电影网| 亚洲麻豆国产自偷在线| 一区二区三区四区五区精品| 欧美日韩ab| 一区二区三区视频在线播放| 亚洲自拍啪啪| 国产精品一区二区在线观看网站 | aa成人免费视频| 欧美全黄视频| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲精品永久免费| 欧美精品在线视频观看| 一区二区三区高清视频在线观看| 亚洲一品av免费观看| 国产精品免费久久久久久| 午夜精品视频网站| 蜜臀99久久精品久久久久久软件| 在线免费一区三区| 欧美电影在线| 在线综合+亚洲+欧美中文字幕| 亚洲一区二区成人在线观看| 国产精品一区二区视频| 久久精品午夜| 亚洲激情一区| 亚洲欧美国产另类| 国产综合网站| 暖暖成人免费视频| 宅男噜噜噜66国产日韩在线观看| 欧美一区二区在线播放| 在线免费观看欧美| 欧美日韩中文字幕精品| 亚洲欧美日韩天堂| 欧美激情一区二区三区蜜桃视频| 在线中文字幕不卡| 狠狠色噜噜狠狠狠狠色吗综合| 能在线观看的日韩av| 亚洲特色特黄| 欧美国产激情| 亚洲欧美一区二区三区在线 | 久久成人精品无人区| 在线日韩欧美| 国产精品色在线| 国产日韩欧美在线视频观看| 免费观看在线综合| 亚洲另类黄色| 狠狠爱成人网| 国产精品草草| 欧美 日韩 国产精品免费观看| 亚洲视频观看| 亚洲国产一区二区三区a毛片| 亚洲欧美日韩精品久久亚洲区 | 久久av老司机精品网站导航| 亚洲精品视频啊美女在线直播| 国产日韩欧美精品综合| 欧美久久影院| 久久免费精品日本久久中文字幕| 艳女tv在线观看国产一区| 久久亚洲春色中文字幕久久久| 亚洲午夜黄色| 亚洲日韩成人| 伊人久久大香线| 国产女主播一区二区| 欧美日韩亚洲一区二区三区在线观看 | 亚洲啪啪91| 欧美va亚洲va国产综合| 亚洲免费在线播放| 亚洲麻豆av| 亚洲国产高清aⅴ视频| 国产午夜久久| 欧美日韩在线精品一区二区三区| 久久夜色精品国产噜噜av| 性欧美精品高清| 亚洲欧美综合v| 亚洲尤物在线视频观看| 99re6这里只有精品视频在线观看| 欧美黄色一区| 欧美高清在线| 欧美黄色免费网站| 免费久久精品视频| 欧美成人国产一区二区| 麻豆久久久9性大片| 久久免费国产精品1| 久久亚洲一区二区| 免费人成精品欧美精品| 免费影视亚洲| 欧美黑人多人双交| 亚洲激情中文1区| 亚洲巨乳在线| 一区二区三区**美女毛片| aa级大片欧美| 亚洲免费在线视频| 性刺激综合网| 国模大胆一区二区三区| 国产乱码精品一区二区三区五月婷| 欧美精品一区三区在线观看| 欧美区二区三区| 欧美四级电影网站| 国产精品试看| 狠狠狠色丁香婷婷综合激情| 永久免费精品影视网站| 亚洲高清资源| 日韩视频在线一区二区| 亚洲网站在线| 久久精品亚洲精品国产欧美kt∨| 久久久久99精品国产片| 欧美成人免费全部| 亚洲激情在线观看| 亚洲自拍电影|