隨筆-28  評(píng)論-51  文章-10  trackbacks-0
           1 #include <stdio.h>
           2 #include <stdlib.h>
           3 //前算完算阿,以前一直以為弄懂了傳值和傳引用,但是現(xiàn)在//一看未必阿,特別是碰到指針的時(shí)候
           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
          上面的代碼能正確執(zhí)行嗎?
          各位高手應(yīng)該能看出來(lái)了。。
          結(jié)果是:(gcc下)
          IN fun: output: ab
          Segmentation fault (core dumped)

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

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

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


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

          我本來(lái)也試圖用引用&的,但是gcc不支持,就是說(shuō)c語(yǔ)言里面沒(méi)有引用的,也許比較BT,最近就是想做純c的, 所以最后選擇了全局變量 char **data; 來(lái)獲得fun的結(jié)果,不知道還有什么好方法,可以獲得fun處理后的結(jié)果的(c語(yǔ)言)?  回復(fù)  更多評(píng)論
            
          # re: 指針和引用, 你真的會(huì)了么? 2008-03-29 20:55 | ZelluX
          @fullfocus
          你用的是C,卻用了這么個(gè)題目,不看代碼都知道你的理解還有偏差。
          建議先看看Computer System, A Programmer's Perspective.  回復(fù)  更多評(píng)論
            
          # re: 指針和引用, 你真的會(huì)了么? 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;
          }
          另:對(duì)于java,引用的傳遞也是一個(gè)很容易引起迷惑的地方。同事中有從事java開(kāi)發(fā)的,他們對(duì)于java的引用的理解也經(jīng)常出現(xiàn)偏差。我不知道怎么實(shí)現(xiàn)java中的“修改引用本身”,但是也許你能給出些解釋。具體問(wèn)題的定義參考“C#中引用與C++中指針和引用以及參數(shù)的傳遞”(http://blog.chinaunix.net/u/12783/showart_380164.html),我在其中列出了C#和C++的實(shí)現(xiàn),不知你能不能在后面附上java的實(shí)現(xiàn)。  回復(fù)  更多評(píng)論
            
          # re: 指針和引用, 你真的會(huì)了么? 2008-04-06 09:09 | 一手的小窩窩
          說(shuō)實(shí)話,我跟著 ccrun.com 里面牛人混了幾年,還是沒(méi)搞清楚,失敗,沒(méi)有專注去做 C /C++,雖然覺(jué)得它好,但是自我感覺(jué),不下功能,還是不能理解,C++是比較復(fù)雜,需要的知識(shí)體系比較全面。  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 绥化市| 乐山市| 阳城县| 华宁县| 星子县| 旺苍县| 抚远县| 六枝特区| 武城县| 中山市| 于田县| 潼关县| 八宿县| 余姚市| 武功县| 抚宁县| 泗水县| 喀什市| 精河县| 文成县| 乐平市| 碌曲县| 四子王旗| 佳木斯市| 德兴市| 常德市| 辉南县| 正蓝旗| 肥东县| 高雄市| 天祝| 山丹县| 纳雍县| 来凤县| 伊川县| 灵寿县| 柏乡县| 三台县| 鄂托克旗| 安岳县| 密山市|