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

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>
            欧美专区在线播放| 久久精品中文| 午夜日韩激情| 免费成年人欧美视频| 日韩午夜精品视频| 久久精品亚洲| 国产精品视频999| 亚洲激情综合| 久久久av毛片精品| 欧美一区二区三区视频免费播放| 欧美日韩国产经典色站一区二区三区| 国模吧视频一区| 亚洲自拍电影| 亚洲免费不卡| 国产精品久久久久一区二区三区共 | 久久精品国产免费观看| 欧美日韩视频第一区| 亚洲国产日韩欧美| 99精品免费视频| 欧美精品色综合| 亚洲国产一区二区三区a毛片| 亚洲国内自拍| 久久免费高清视频| 亚洲视频观看| 欧美日韩视频在线一区二区| 香蕉亚洲视频| 亚洲综合首页| 国产精品一级| 久久精品国产清自在天天线| 亚洲性视频网址| 国产精品国产三级国产普通话99| 一本久久综合| 亚洲欧洲精品一区二区三区| 久久综合久久久久88| 亚洲国产精品va在线看黑人 | 午夜精品视频一区| 久久久久91| 亚洲一区二区三区影院| 一本一本大道香蕉久在线精品| 欧美精品久久一区| 久久精品免费播放| 国产精品wwwwww| 香蕉av777xxx色综合一区| 久久只精品国产| 亚洲欧美日韩视频一区| 亚洲欧美综合v| 狠狠色综合一区二区| 免费成人网www| 国产精品无码永久免费888| 亚洲国产日韩在线| 尤物yw午夜国产精品视频明星| 女同一区二区| 欧美日本视频在线| 午夜电影亚洲| 欧美性猛交一区二区三区精品| 欧美成人首页| 欧美三级电影大全| 久久av在线| 欧美va天堂在线| 午夜日韩在线| 国产精品久久久久秋霞鲁丝| 亚洲免费观看高清完整版在线观看| 激情文学一区| 日韩亚洲视频| 亚洲视频一区在线| 久久亚洲国产成人| 亚洲专区欧美专区| 欧美日韩日本国产亚洲在线| 日韩视频在线你懂得| 日韩亚洲欧美在线观看| 欧美一区二区久久久| 欧美一区二区三区四区夜夜大片| 鲁大师成人一区二区三区| 亚洲欧美在线播放| 国产精品一级二级三级| 午夜一区在线| 一区二区三区欧美成人| 久久天堂国产精品| 欧美韩国日本综合| 国产色产综合色产在线视频| 亚洲欧洲在线免费| 亚洲午夜一二三区视频| 国产精品免费一区豆花| 欧美一区二区三区四区高清| 玖玖国产精品视频| 国产美女诱惑一区二区| 久久精品国内一区二区三区| 裸体丰满少妇做受久久99精品| 在线日韩中文字幕| 欧美在线视频不卡| 欧美激情在线免费观看| 99精品99| 国产精品亚洲片夜色在线| 久久国产成人| 亚洲国产电影| 在线免费高清一区二区三区| 欧美不卡视频一区发布| 欧美成人免费在线| 国产精品99久久久久久久vr| 国产色产综合色产在线视频| 另类图片国产| 亚洲一级一区| 欧美激情第4页| 亚洲一区三区在线观看| 激情国产一区二区| 欧美日韩一区二区三区在线| 欧美一区二区在线观看| 亚洲裸体俱乐部裸体舞表演av| 亚洲精品影视在线观看| 欧美二区在线| 欧美不卡视频一区发布| 亚洲午夜精品福利| 亚洲二区视频| 国产欧美日韩精品丝袜高跟鞋| 亚洲欧美激情一区二区| 欧美激情一区二区三区高清视频 | 亚洲毛片在线看| 国产日产欧产精品推荐色| 欧美黄色影院| 久久免费视频网站| 午夜国产精品视频| 国产精品99久久99久久久二8 | 欧美高清视频一二三区| 久久精品av麻豆的观看方式| 一本色道久久综合亚洲91| 红桃av永久久久| 国产精品资源| 国产精品区一区| 欧美日韩一区二区在线播放| 免费永久网站黄欧美| 久久久无码精品亚洲日韩按摩| 欧美激情一区二区三区蜜桃视频| 久久激情视频免费观看| 午夜免费在线观看精品视频| 日韩亚洲精品在线| 亚洲黄一区二区三区| 精品成人一区二区| 韩国美女久久| 国内偷自视频区视频综合| 国产日韩欧美视频| 国产欧美一区二区精品性| 国产精品入口66mio| 欧美三级不卡| 国产精品福利久久久| 欧美性开放视频| 国产精品久久国产三级国电话系列 | 午夜精彩视频在线观看不卡| 在线亚洲自拍| 亚洲图片你懂的| 亚洲在线播放| 亚洲国产成人在线播放| 亚洲高清久久| 亚洲人成在线影院| 久久精品视频在线| 久久一二三四| 午夜精彩国产免费不卡不顿大片| 午夜久久资源| 久久精品天堂| 欧美高清影院| 亚洲精品影视| 亚洲一区二区高清| 久久黄色网页| 欧美 日韩 国产 一区| 欧美韩日高清| 国产精品一区二区久久久| 国产亚洲精品激情久久| 欧美日韩综合在线免费观看| 国产精品欧美久久久久无广告| 国产伦精品一区二区三区四区免费 | 欧美v亚洲v综合ⅴ国产v| 欧美精品久久久久久久免费观看| 国产精品豆花视频| 国产自产2019最新不卡| 亚洲精品国产精品国自产在线 | 国产亚洲毛片| 亚洲国产一区二区三区高清| 在线视频日韩精品| 久久午夜精品| 亚洲美女中文字幕| 欧美一区二区在线看| 欧美精品播放| 韩国美女久久| 亚洲一二三区在线观看| 久久亚洲国产成人| 亚洲精品一区久久久久久| 欧美一级淫片aaaaaaa视频| 女同一区二区| 国产亚洲欧美日韩一区二区| 亚洲精品国产视频| 欧美一区二区| 亚洲肉体裸体xxxx137| 羞羞视频在线观看欧美| 欧美日韩国产限制| 在线观看91久久久久久| 欧美亚洲免费| 99热免费精品| 免费在线视频一区| 国内外成人免费视频| 亚洲午夜日本在线观看| 亚洲电影一级黄|