<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-28  評論-51  文章-10  trackbacks-0
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 //前算完算阿,以前一直以為弄懂了傳值和傳引用,但是現在//一看未必阿,特別是碰到指針的時候
     4 char **data;
     5 void fun(char ** pointer)
     6 {
     7         pointer=(char**)malloc(sizeof(char** 10);
     8         pointer[0= (char*)malloc(sizeof(char* 10);
     9         pointer[0][0= 'a';
    10         pointer[0][1= 'b';
    11         pointer[0][2= '\0';
    12     
    13         printf("IN fun: output: %s\n", pointer[0]);
    14         
    15 }
    16 int main()
    17 {
    18     
    19     fun(data);
    20     printf("IN main: output: %s\n", data[0]);     
    21     return 0;
    22 }
    23 
    24
    上面的代碼能正確執行嗎?
    各位高手應該能看出來了。。
    結果是:(gcc下)
    IN fun: output: ab
    Segmentation fault (core dumped)

    愣了好一陣子,才反映過來,被傳的指針蒙騙了,
    在12行加入這行就ok了。這個隨是小事,但馬虎不得阿,哈哈

            data = pointer;
    posted on 2008-03-28 22:54 fullfocus 閱讀(1425) 評論(9)  編輯  收藏 所屬分類: C/C++

    評論:
    # re: 指針和引用, 你真的會了么? 2008-03-29 15:27 | ZelluX
    看來你還是沒搞清楚.  回復  更多評論
      
    # re: 指針和引用, 你真的會了么? 2008-03-29 15:57 | fullfocus
    @ZelluX
    -》看來你還是沒搞清楚??
    后來修改了以后,可以成功運行,輸出也正確啊,是不是還有我沒考慮周全的地方? 多謝指教!!^_^


      回復  更多評論
      
    # re: 指針和引用, 你真的會了么? 2008-03-29 18:06 | raof01
    首先,指針和引用不是一個概念——盡管很多編譯器用指針實現引用。其次,你還是沒有搞清楚指針。
    data = pointer; //使用全局數據,并沒有真正使用參數返回內存
    fun(data); // 使用全局變量作為參數,而函數體中又使用了data這個全局變量。實際上,fun中的pointer就是data的一個拷貝。
    綜上,整個程序是個充滿bug的程序,而且還有內存泄露,每次調用fun(),則要丟失50個字節。這個程序只不過碰巧能工作罷了。整個程序和你對于指針的理解都是一塌糊涂——這么說有點不客氣,但這是事實。
    相信你是希望通過一個二級指針來返回一段內存,那么應該如下:
    void fun(char ** &pointer)
    {
    pointer=(char**)malloc(sizeof(char*) * 10); // pointer指向一塊內存區,該內存區的元素類型是char *相當于char * []
    *pointer = (char*)malloc(sizeof(char) * 10);//為第一個元素分配10字節空間
    **pointer = 'a';
    *(*pointer + 1) = 'b';
    *(*pointer + 2) = '\0';
    printf("IN fun: output: %s\n", *pointer);
    }
    int main()
    {
    char **data;
    fun(&data);
    printf("IN main: output: %s\n", *data);
    if (*data) //釋放內存
    free(*data);
    if (data)
    free(data);
    return 0;
    }
    當使用指針時不能夠清楚理解時,畫一個圖能有助于理解。有問題可以參考:"指針是通往地獄的捷徑"(http://blog.chinaunix.net/u/12783/showart_376700.html)及"C/C++:如何理解復雜的聲明"(http://blog.chinaunix.net/u/12783/showart_378340.html)  回復  更多評論
      
    # re: 指針和引用, 你真的會了么? 2008-03-29 18:12 | raof01
    typedef char * T;
    void fun(T* &);
    這樣寫估計好理解一些。本來不需要“&”,但你要返回的是這樣一段內存:
    ------<----- T*
    | T |-->-------------------------------------------
    ------ | | | | | | | | | | | |
    | | -------------------------------------------
    ------
    | |
    ------
    | |
    ------
    | |
    ------
    | |
    ------
    | |
    ------
    | |
    ------
    | |
    ------
    | |
    ------  回復  更多評論
      
    # re: 指針和引用, 你真的會了么? 2008-03-29 19:23 | raof01
    或者:
    char ** func();
    // ...
    // In main():
    char ** data = func();
    // ...
    無論如何,你還是看看林銳的《高質量C/C++編程》  回復  更多評論
      
    # re: 指針和引用, 你真的會了么?[未登錄] 2008-03-29 20:04 | fullfocus
    @raof01
    真的非常感謝raof01,寫慣了java,根本沒有意識到c還要釋放內存的。您舉的兩個例子非常棒,看了你的文章,orz.....^_^

    我本來也試圖用引用&的,但是gcc不支持,就是說c語言里面沒有引用的,也許比較BT,最近就是想做純c的, 所以最后選擇了全局變量 char **data; 來獲得fun的結果,不知道還有什么好方法,可以獲得fun處理后的結果的(c語言)?  回復  更多評論
      
    # re: 指針和引用, 你真的會了么? 2008-03-29 20:55 | ZelluX
    @fullfocus
    你用的是C,卻用了這么個題目,不看代碼都知道你的理解還有偏差。
    建議先看看Computer System, A Programmer's Perspective.  回復  更多評論
      
    # re: 指針和引用, 你真的會了么? 2008-03-29 22:08 | raof01
    @fullfocus
    char ** fun()
    {
    char ** pointer=(char**)malloc(sizeof(char*) * 10);
    *pointer = (char*)malloc(sizeof(char) * 10);
    **pointer = 'a';
    *(*pointer + 1) = 'b';
    *(*pointer + 2) = '\0';
    printf("IN fun: output: %s\n", *pointer);
    return pointer;
    }
    另:對于java,引用的傳遞也是一個很容易引起迷惑的地方。同事中有從事java開發的,他們對于java的引用的理解也經常出現偏差。我不知道怎么實現java中的“修改引用本身”,但是也許你能給出些解釋。具體問題的定義參考“C#中引用與C++中指針和引用以及參數的傳遞”(http://blog.chinaunix.net/u/12783/showart_380164.html),我在其中列出了C#和C++的實現,不知你能不能在后面附上java的實現。  回復  更多評論
      
    # re: 指針和引用, 你真的會了么? 2008-04-06 09:09 | 一手的小窩窩
    說實話,我跟著 ccrun.com 里面牛人混了幾年,還是沒搞清楚,失敗,沒有專注去做 C /C++,雖然覺得它好,但是自我感覺,不下功能,還是不能理解,C++是比較復雜,需要的知識體系比較全面。  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 韩国日本好看电影免费看| 免费一级成人毛片| 好爽…又高潮了免费毛片 | 99re6免费视频| 在线观着免费观看国产黄| 亚洲成AV人片在线播放无码| 亚洲sss综合天堂久久久| av成人免费电影| 成年女人免费v片| 亚洲AV无码久久精品色欲| 国产精品亚洲色婷婷99久久精品| 无码av免费一区二区三区试看| 免费a级黄色毛片| 免费高清A级毛片在线播放| 猫咪社区免费资源在线观看| 亚洲AV日韩AV永久无码免下载 | 免费一区二区三区在线视频| 亚洲国产婷婷综合在线精品| 亚洲欧美黑人猛交群| 永久免费在线观看视频| 亚洲AV无码专区电影在线观看 | 91人成网站色www免费下载| 亚洲色婷婷综合开心网| 在线观看亚洲专区| 亚洲综合亚洲综合网成人| 国产精品网站在线观看免费传媒| 亚洲AV无码一区二三区| 亚洲高清毛片一区二区| 欧亚精品一区三区免费| 色费女人18女人毛片免费视频| 成年女人免费碰碰视频| 亚洲高清免费视频| 4480yy私人影院亚洲| 99re这里有免费视频精品| 亚洲中文字幕无码mv| 巨胸喷奶水视频www网免费| 四虎一区二区成人免费影院网址| 亚洲AV无码不卡在线观看下载| 免费无码av片在线观看| 亚洲成a人片在线观看中文动漫| 在线v片免费观看视频|