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

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 老狼 閱讀(784) 評論(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>
            亚洲风情在线资源站| 欧美激情久久久久| 久久国产精品一区二区| 99综合电影在线视频| 亚洲国产电影| 亚洲日本激情| 最新日韩在线| 夜夜嗨av一区二区三区网站四季av| 亚洲黄一区二区三区| 亚洲精品久久久蜜桃| 亚洲乱码国产乱码精品精| 亚洲人成啪啪网站| 亚洲视频综合在线| 欧美亚洲综合在线| 亚欧成人在线| 看片网站欧美日韩| 亚洲国产欧美国产综合一区| 亚洲日韩欧美一区二区在线| 夜久久久久久| 香蕉国产精品偷在线观看不卡| 欧美日韩成人一区二区| 欧美高清自拍一区| 亚洲高清中文字幕| 亚洲毛片播放| 亚洲美女av网站| 先锋影院在线亚洲| 欧美激情视频在线播放 | 亚洲精品中文字幕女同| 亚洲视频999| 老司机免费视频一区二区| 欧美日韩国产成人高清视频| 国产伦精品一区二区三区在线观看 | 欧美成人一区二区| 亚洲精品影院在线观看| 午夜精品亚洲| 欧美激情一区二区三区在线| 国产婷婷97碰碰久久人人蜜臀| 亚洲区第一页| 久久夜精品va视频免费观看| 最新日韩精品| 久久免费视频在线| 国产精品永久免费| 在线视频免费在线观看一区二区| 久久久久久欧美| 亚洲少妇在线| 欧美日韩午夜激情| 亚洲日本成人网| 免费精品99久久国产综合精品| 亚洲午夜日本在线观看| 欧美高清视频在线| 亚洲国产天堂久久综合| 久久婷婷激情| 西瓜成人精品人成网站| 国产精品成av人在线视午夜片| 亚洲人成7777| 欧美gay视频| 久久久免费av| 在线成人免费视频| 玖玖国产精品视频| 久久久xxx| 曰本成人黄色| 久久综合色影院| 久久久久国产精品一区| 狠狠噜噜久久| 欧美成人按摩| 欧美成人四级电影| 亚洲精选91| 亚洲精品一区中文| 欧美天堂亚洲电影院在线观看| 一本久道久久综合中文字幕| 亚洲精品男同| 国产精品成人v| 午夜精品福利一区二区三区av | 欧美日韩亚洲一区二区三区在线观看| 国产伦精品一区二区三区免费迷| 亚洲尤物精选| 亚洲一区二区成人| 国产目拍亚洲精品99久久精品 | 最新亚洲激情| 欧美老女人xx| 亚洲专区在线视频| 午夜精品久久久久久久久久久久| 国产欧美日韩综合一区在线观看| 久久精品免费看| 六月婷婷一区| 一区二区久久久久| 亚洲性线免费观看视频成熟| 国产日韩在线看| 欧美成人免费全部| 欧美日韩亚洲精品内裤| 午夜一区不卡| 免费不卡中文字幕视频| 中文久久乱码一区二区| 午夜在线视频一区二区区别| 亚洲经典三级| 亚洲一区二区伦理| 在线观看不卡| 一区二区三区四区五区精品视频 | 亚洲一区二区三区色| 香蕉成人久久| 一级日韩一区在线观看| 午夜视频久久久久久| 91久久精品视频| 亚洲男人的天堂在线观看| 亚洲高清视频的网址| 宅男在线国产精品| 最新69国产成人精品视频免费 | 男男成人高潮片免费网站| 亚洲一级黄色片| 久久综合电影一区| 午夜精品剧场| 欧美女同视频| 免费av成人在线| 国产精品无码永久免费888| 免费成人在线视频网站| 国产精品美女一区二区| 亚洲国产另类 国产精品国产免费| 国产精品入口夜色视频大尺度 | 蜜臀久久99精品久久久久久9 | 亚洲国产99| 欧美一区二区三区婷婷月色| 99re成人精品视频| 久久久国产精品亚洲一区 | 中文亚洲视频在线| …久久精品99久久香蕉国产| 亚洲视频欧洲视频| 一区二区欧美亚洲| 欧美电影在线观看完整版| 久久躁狠狠躁夜夜爽| 国产伦精品一区二区三区视频孕妇 | 国内精品伊人久久久久av一坑| 91久久中文字幕| 影音先锋日韩资源| 久久se精品一区精品二区| 亚洲在线黄色| 欧美三级午夜理伦三级中文幕 | 国产精品视频一区二区高潮| 亚洲人成网站在线播| 亚洲精品极品| 欧美插天视频在线播放| 欧美成人小视频| 亚洲精品永久免费| 欧美 日韩 国产一区二区在线视频 | 蜜桃av久久久亚洲精品| 黄色成人av| 久久欧美中文字幕| 欧美成人免费小视频| 亚洲高清成人| 欧美激情中文字幕乱码免费| 亚洲激情一区| 亚洲私人影院在线观看| 欧美先锋影音| 亚洲中午字幕| 久久久久久久综合日本| 国内精品视频在线观看| 麻豆免费精品视频| 亚洲激精日韩激精欧美精品| 亚洲精品一区久久久久久| 欧美精品三级| 中文日韩在线视频| 久久蜜桃资源一区二区老牛| 伊人久久av导航| 欧美精品激情在线观看| 中文久久精品| 裸体歌舞表演一区二区| 日韩午夜在线电影| 国产精品爽爽爽| 久久躁日日躁aaaaxxxx| 亚洲乱码久久| 久久久午夜电影| 日韩亚洲欧美一区| 国产精品区一区二区三区| 久久久久久69| 9久re热视频在线精品| 久久久www成人免费毛片麻豆| 亚洲国产aⅴ天堂久久| 国产精品久久久久国产a级| 久久大逼视频| 99国产成+人+综合+亚洲欧美| 欧美日韩国产综合久久| 亚洲女女做受ⅹxx高潮| 国产亚洲欧美日韩精品| 欧美大片在线观看一区二区| 亚洲视频一区| 欧美激情一区二区三区高清视频 | 久久夜精品va视频免费观看| 夜夜爽av福利精品导航| 国产亚洲精品aa午夜观看| 免费看av成人| 欧美亚洲一级片| 日韩午夜精品视频| 麻豆精品网站| 小辣椒精品导航| 一本色道精品久久一区二区三区| 国产一区二区三区高清播放| 欧美日韩麻豆| 欧美激情综合亚洲一二区| 欧美专区在线| 亚洲综合导航| 中文日韩在线视频|