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

Mike's blog

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  0 Posts :: 23 Stories :: 83 Comments :: 0 Trackbacks

常用鏈接

留言簿(17)

我參與的團隊

搜索

  •  

最新評論

先看一個例子:
 1#include <stdio.h>
 2#include <stdlib.h>
 3#include <string.h>
 4
 5char* fun(const char* src)
 6{
 7  static char dest[32= "";
 8  
 9  strcpy(dest, src);
10
11  return dest;
12}

13
14int main()
15{
16  char s1[32= "";
17  char s2[32= "";
18
19  strcpy(s1, fun("hello"));
20  strcpy(s2, fun("world"));
21
22  printf("%s %s\n", s1, s2);
23  printf("%s %s\n", fun("hello"), fun("world"));
24
25  return 0;
26}

    讀一下這個程序,先看這個程序寫的有問題沒(假設fun函數的參數長度小于32)?如果你對這個程序中的fun函數返回一個局部變量的數組產生了疑問,那么我希望你是沒注意到我使用的static類型,若你仍有疑問,建議你先回去查查static變量的作用域和生命周期的概念。
    OK,是運行這個程序的時候了,看一下運行結果是否跟你想象的一樣呢?如果是一樣的,那么這篇文章你不用看了,因為你已經掌握了我下面要說的問題了。好吧,對于不理解運行結果的朋友,我們來分析一些下面那個printf語句,首先要知道printf中的表達式、函數的執行順序是至右向左的,也就是先執行了fun("world")返回了dest的地址,然后再執行fun("hello")也返回了dest的地址,而這兩次返回的dest用的同一塊地址(因為是static類型),也就是第二次的執行覆蓋了第一次執行的結果,對dest地址進行了重新的賦值,所以結果就是打印兩個hello了。


    我們在寫C/C++程序的時候,經常需要從調用函數中取得自己想要的數據,這就需要調用者和函數之間要有個內存的交互,我們通常采用的方法是傳遞一個指針給被調函數,作為被調函數的輸出參數,這也是我們常用的、規范的做法。
    但有很多程序員比較習慣直接取返回值,這就面臨一個問題就是普通局部變量都是在棧上分派的,會隨著函數的結束而彈棧釋放,那么就會出現返回局部變量數組的問題,這時有人會想到用malloc或new在堆上分派內存,沒錯,這樣是避免了前面說的問題,但這樣又會帶來新的問題,就是需要在外部對這塊內存進行釋放,這個是比較難把握的,多次釋放會出現程序的crash,忘記釋放了會出現內存leak,所以這種方法也不被推薦。還有人想到了更另類的方法,就是上面例子中的static類型,沒錯,static變量也是全局的,但就會出現上面程序的運行結果(可以認為不是我們想要的結果,也就是錯誤的結果)。
    所以,我們要慎用返回函數內部的static內存的這種設計,但如果在無法改變設計模式的情況下(有些系統函數的實現,比如inet_ntoa,可以通過在man手冊中看到這樣的一句話:The string is returned in a statically allocated buffer, which subsequent calls will overwrite),那么在自己使用的時候一定要注意,不要試圖保存返回的內存地址或引用,而要保存返回內存的內容,也就是例子程序中的strcpy兩行。

inet_ntoa的錯誤使用(判斷兩個IP地址是否相等):

 1struct in_addr addr1;
 2struct in_addr addr2;
 3
 4// 網絡包中包含了源地址
 5addr1.s_addr = 0x6500A8C0 // 192.168.0.101
 6addr2.s_addr = 0x6600A8C0 // 192.168.0.102
 7
 8// 這個if語句將永遠為真
 9if (strcmp(inet_ntoa(addr1), inet_ntoa(addr2)) == 0{
10  // do something
11}
 else {
12  // do other thing
13}
posted on 2008-11-25 15:06 老狼 閱讀(804) 評論(2)  編輯 收藏 引用 所屬分類: C/C++

Feedback

# re: 返回static內部變量的陷阱[未登錄] 2008-11-27 15:05 小兵
學習了  回復  更多評論
  

# re: 返回static內部變量的陷阱 2009-01-07 12:18 July
很好的文章,謝謝分享  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久精品国产一区二区三| 欧美国产欧美亚州国产日韩mv天天看完整 | 一区二区久久久久| 欧美精品一区二区三区蜜桃 | 一本大道久久a久久精二百| 欧美大片免费久久精品三p| 久久综合色播五月| 亚洲欧洲一区二区天堂久久| 欧美夫妇交换俱乐部在线观看| 久久在精品线影院精品国产| 亚洲第一页在线| 亚洲国产精品传媒在线观看| 亚洲韩日在线| 欧美激情片在线观看| 欧美精品久久久久久久免费观看 | 国语自产在线不卡| 久久在线免费观看| 欧美刺激性大交免费视频| 一区二区三区高清在线| 亚洲香蕉在线观看| 免费在线亚洲欧美| 一区二区三区高清在线| 欧美有码在线观看视频| 黑人一区二区三区四区五区| 久久伊人免费视频| 欧美日本中文| 久久久7777| 女人香蕉久久**毛片精品| 在线亚洲欧美视频| 欧美在线www| 99热免费精品在线观看| 午夜精品久久久久久久白皮肤| 国产欧美日韩免费看aⅴ视频| 久久精品视频播放| 欧美激情综合五月色丁香| 欧美专区在线| 欧美精品在线观看播放| 久久伊人亚洲| 国产精品v片在线观看不卡| 美女精品在线观看| 欧美性猛交99久久久久99按摩 | 亚洲第一精品夜夜躁人人爽| 国产精品www网站| 美日韩精品视频| 国产精品女主播一区二区三区| 美女视频黄免费的久久| 国产精品视频xxx| 亚洲欧洲一区二区天堂久久 | 国产精品美女在线观看| 亚洲第一区中文99精品| 国外成人免费视频| 国产精品99久久久久久有的能看 | 欧美1区3d| 久久久一本精品99久久精品66| 欧美日韩视频在线观看一区二区三区 | 午夜精品久久久久99热蜜桃导演| 浪潮色综合久久天堂| 亚洲一级黄色片| 欧美成人首页| 免费亚洲电影在线| 国产亚洲二区| 在线欧美一区| 亚洲蜜桃精久久久久久久| 亚洲电影免费在线| 久久精品一区二区三区不卡| 欧美中文字幕视频在线观看| 国产精品久久精品日日| 亚洲片国产一区一级在线观看| 亚洲第一成人在线| 久久久另类综合| 快射av在线播放一区| 国产一区二区在线免费观看 | 亚洲午夜在线观看视频在线| 一区二区三区欧美在线| 欧美片在线播放| 亚洲精品三级| 国产精品99久久久久久久久久久久 | 久久国产精品网站| 国产欧美日韩免费看aⅴ视频| 亚洲综合久久久久| 久久成人精品无人区| 国产亚洲人成a一在线v站| 亚洲欧美一级二级三级| 久久国产欧美精品| 黄色一区二区三区四区| 久久久久国产精品午夜一区| 女人天堂亚洲aⅴ在线观看| 亚洲人午夜精品| 欧美日韩国产高清| 亚洲图片在线观看| 久久精品夜色噜噜亚洲aⅴ| 国产字幕视频一区二区| 久久综合伊人77777蜜臀| 亚洲国产你懂的| 亚洲性线免费观看视频成熟| 国产精品区一区| 久久久久久久尹人综合网亚洲 | 欧美高清免费| 一区二区三区久久久| 国产精品视频yy9299一区| 欧美中文字幕在线| 亚洲国产日韩欧美在线99| 亚洲欧美另类中文字幕| 国外视频精品毛片| 欧美激情亚洲一区| 亚洲免费影视| 亚洲国产成人久久综合一区| 亚洲综合久久久久| 伊人伊人伊人久久| 欧美日在线观看| 久久久久久久一区二区三区| 一本大道久久a久久精品综合| 久久国产天堂福利天堂| 洋洋av久久久久久久一区| 国产美女诱惑一区二区| 欧美黑人多人双交| 欧美在线高清| 一区二区三区久久精品| 欧美电影在线观看| 欧美在线视频免费播放| 夜夜嗨av一区二区三区四季av| 国内精品久久久久久影视8| 欧美日韩午夜激情| 美女精品视频一区| 欧美一区视频| 亚洲少妇中出一区| 91久久午夜| 欧美xx69| 老司机免费视频久久| 亚洲欧美怡红院| 国产精品99久久久久久久久久久久 | 99香蕉国产精品偷在线观看| 激情综合久久| 国产午夜精品一区二区三区视频| 欧美日韩中文字幕精品| 欧美激情第五页| 欧美 亚欧 日韩视频在线| 久久精品视频亚洲| 欧美一二区视频| 亚洲欧美日韩在线一区| 亚洲一区高清| 在线综合亚洲| 亚洲深夜影院| 亚洲天堂网在线观看| 日韩系列在线| 99国产一区| 一区二区三区精密机械公司| 一区二区三区精品久久久| 一本一本久久| 中日韩高清电影网| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲茄子视频| 999在线观看精品免费不卡网站| 欧美激情综合色| 亚洲黄色免费网站| 亚洲激情啪啪| 一区二区三区视频在线看| 99国产精品99久久久久久| 亚洲毛片在线观看| 在线视频亚洲| 性娇小13――14欧美| 老牛国产精品一区的观看方式| 久久精品中文字幕免费mv| 久久婷婷国产综合精品青草| 久久性色av| 亚洲国内欧美| 一区二区三区鲁丝不卡| 欧美一区网站| 美日韩丰满少妇在线观看| 欧美精品 国产精品| 欧美天堂亚洲电影院在线观看| 国产精品免费视频xxxx | 久久精品99久久香蕉国产色戒| 国产精品亚洲成人| 国产美女精品在线| 在线看一区二区| 中文有码久久| 久久视频精品在线| 亚洲国产精品传媒在线观看| 欧美精品一区二区精品网| 亚洲午夜一区二区三区| 久久久久综合网| 欧美日韩一级片在线观看| 国产日韩在线播放| 亚洲高清二区| 亚洲免费在线观看| 麻豆精品网站| 亚洲婷婷国产精品电影人久久| 欧美影院精品一区| 欧美美女bb生活片| 狠狠色伊人亚洲综合成人 | 欧美视频在线观看 亚洲欧| 国产视频久久久久久久| 亚洲精品老司机| 久久久高清一区二区三区| 亚洲精品日韩欧美| 久久精品亚洲一区二区三区浴池| 欧美日韩一区二区精品| 激情文学一区| 欧美一区二区三区在线观看|