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

攀升·Uranus


Something Different,Something New
數據加載中……

返回內部靜態成員 熟練C/C++(一)

 

        看完陳皓的C/C++返回內部靜態成員的陷阱,認識到自己確實對C/C++本身語法研究的不夠清楚,所以這些時間就在對基本知識進行回顧,真的還蠻有意思的。

        我在用C/C++函數時,從沒有全面考慮過該函數功能,只是知道它能做,基本對函數細節沒有了解,就拿下面這個函數做個例子:

        char *inet_ntoa(struct in_addr in);

        struct in_addr {      unsigned long int s_addr; }

 

        看到這個我就能想到該函數是把一個unsigned long type的數轉換成一個字符串。其它什么都不想。現在讓我們來仔細品讀里面的東西。

        我傳入一個unsigned long type的數據,它給我傳出一個char *,那這個char * 在函數里怎么分配空間的。首先不可能是堆分配,因為如果是那樣的話,你用完這個函數后還要釋放資源。其次不可能是棧分配,因為那樣函數返回后棧也會跟著釋放。那還有可能是全局變量,如果這樣的話,C/C++中已經有好多全局了。那還有一種是static的可能,static不會隨著函數的返回而釋放,也就是說,它是一塊長期被分配的內存空間,現在在假若我在程序中這樣寫:

        printf(“%s, %s”, inet_ntoa(a), inet_ntoa(b)); //a, b 是兩個不相等的值

        輸出會讓我大吃一驚,輸出結果一樣。原因很簡單,就是printf先求b,把值給了那個static,然后再求a, 把值又給了staticstatic的那塊內存最終被寫入了a的值,這個時候輸出,那當然就輸出的同一個值了。還有一種錯誤寫法,如下:

 

        Char *tmp1 = inet_ntoa(a);

        Char *tmp2 = inet_ntoa(b);

        這樣也是有問題的,因為tmp1tmp2都指向了一塊內存,當前的static的值就是b的值了。所以總結如下,使用這種函數一定要copy函數返回的值,而不能去保存其內存地址!
附inet_ntoa()源碼:
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <bits/libc-lock.h>

/* The interface of this function is completely stupid, it requires a
   static buffer.  We relax this a bit in that we allow at least one
   buffer for each thread.  */


/* This is the key for the thread specific memory.  */
static __libc_key_t key;

/* If nonzero the key allocation failed and we should better use a
   static buffer than fail.  */

static char local_buf[18];
static char *static_buf;                                //靜態

/* Destructor for the thread-specific data.  */
static void init (void);
static void free_key_mem (void *mem);


char *
inet_ntoa (struct in_addr in)
{
  __libc_once_define (static, once);
  char *buffer;
  unsigned char *bytes;

  /* If we have not yet initialized the buffer do it now.  */
  __libc_once (once, init);

  if (static_buf != NULL)
    buffer = static_buf;
  else
    {
      /* We don't use the static buffer and so we have a key.  Use it
to get the thread-specific buffer.  */

      buffer = __libc_getspecific (key);
      if (buffer == NULL)
{
  /* No buffer allocated so far.  */
  buffer = malloc (18);
  if (buffer == NULL)
    /* No more memory available.  We use the static buffer.  */
    buffer = local_buf;
  else
    __libc_setspecific (key, buffer);
}
    }

  bytes = (unsigned char *) &in;
  __snprintf (buffer, 18, "%d.%d.%d.%d",
      bytes[0], bytes[1], bytes[2], bytes[3]);

  return buffer;
}


/* Initialize buffer.  */
static void
init (void)
{
  if (__libc_key_create (&key, free_key_mem))
    /* Creating the key failed.  This means something really went
       wrong.  In any case use a static buffer which is better than
       nothing.  */

    static_buf = local_buf;
}

posted on 2007-04-13 16:07 攀升 閱讀(1619) 評論(1)  編輯 收藏 引用 所屬分類: C/C++

評論

# re: 返回內部靜態成員 熟練C/C++(一)   回復  更多評論   

static讓我歡喜讓我憂。。。
2007-04-13 18:56 | 田德健
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美a一区二区| 国产专区综合网| 久久久久国产精品人| 一本大道久久a久久综合婷婷| 亚洲大片免费看| 免费一级欧美在线大片| 男女激情视频一区| 欧美国产激情二区三区| 欧美不卡视频一区发布| 亚洲国产成人av在线| 日韩视频免费观看| 亚洲免费视频成人| 久久亚洲免费| 欧美视频在线免费| 黑人巨大精品欧美一区二区| 亚洲第一精品夜夜躁人人爽| 亚洲乱码国产乱码精品精| 亚洲欧美久久久| 美日韩丰满少妇在线观看| 亚洲日本一区二区| 性欧美xxxx大乳国产app| 久久久综合免费视频| 欧美日韩第一区| 国产精品视频yy9299一区| 激情成人综合网| 亚洲视频在线播放| 欧美www视频| 亚洲欧美日韩在线播放| 欧美成人精品不卡视频在线观看| 国产精品乱人伦中文| 亚洲福利视频网| 久久本道综合色狠狠五月| 亚洲国产精品久久久久婷婷老年| 亚洲午夜未删减在线观看| 蜜桃av噜噜一区二区三区| 国产日韩精品电影| 亚洲天堂网在线观看| 欧美电影在线观看完整版| 欧美一区二区三区日韩视频| 欧美日韩国内| 亚洲精品三级| 欧美va天堂在线| 欧美一区二区在线免费观看| 亚洲国产日韩一区二区| 在线观看欧美成人| 久久久国产精品一区二区三区| 亚洲人午夜精品免费| 久久久另类综合| 国产日本欧美视频| 亚洲欧美激情在线视频| 一区二区三区回区在观看免费视频| 久久深夜福利免费观看| 韩国一区二区三区美女美女秀| 香蕉久久精品日日躁夜夜躁| 夜夜嗨av色一区二区不卡| 欧美成年人在线观看| 亚洲电影欧美电影有声小说| 久久人人97超碰精品888| 西瓜成人精品人成网站| 国产精品综合| 久久国产精品久久w女人spa| 亚洲影院色无极综合| 国产精品免费看片| 欧美一区成人| 亚洲女性裸体视频| 国产欧美日韩免费| 欧美一乱一性一交一视频| 亚洲欧洲99久久| 激情懂色av一区av二区av| 欧美jizzhd精品欧美喷水| 美女久久网站| 99视频精品全部免费在线| 99热精品在线观看| 国产伦精品免费视频 | 亚洲网站在线| 国产精品欧美经典| 久久久久久久久一区二区| 久久久久国产一区二区| 亚洲国产成人午夜在线一区| 欧美国产视频一区二区| 欧美人成在线视频| 午夜精品福利在线| 久久久久九九视频| 亚洲精品视频一区| 在线亚洲观看| 国产一区二区三区在线观看精品 | 亚洲国产午夜| 日韩一级二级三级| 国产亚洲一区二区三区在线播放| 久久先锋影音| 欧美人成在线视频| 久久久久久久精| 欧美激情精品| 久久精品国产清自在天天线| 美女91精品| 欧美一区二区观看视频| 免费看亚洲片| 性欧美xxxx大乳国产app| 欧美天天在线| 久久免费一区| 欧美三级日本三级少妇99| 久久精品亚洲热| 欧美日韩中文字幕精品| 久热这里只精品99re8久| 欧美日韩一区在线观看视频| 久久久精品国产免大香伊| 欧美极品一区二区三区| 久久成人18免费网站| 欧美成人一区二区在线| 欧美自拍丝袜亚洲| 欧美日韩视频在线第一区| 另类亚洲自拍| 国产欧美二区| 在线综合亚洲| 99精品国产99久久久久久福利| 久久se精品一区二区| 亚洲一区二区三区三| 牛牛国产精品| 久久综合久久综合久久综合| 国产精品日韩欧美一区二区三区| 欧美成人日韩| 国产自产精品| 欧美一级片久久久久久久| 亚洲天堂av在线免费观看| 两个人的视频www国产精品| 久久久91精品国产一区二区三区| 欧美视频在线免费| 99re热这里只有精品免费视频| 亚洲激情视频网| 老司机成人网| 欧美高清在线一区二区| 一区精品久久| 久久久久高清| 免费影视亚洲| 91久久精品美女高潮| 美女啪啪无遮挡免费久久网站| 免费一级欧美在线大片| 一区视频在线看| 久久久久久久综合狠狠综合| 久久精品一区二区| 国产一区二区三区网站| 久久精品99国产精品日本| 久久久久久久97| 在线观看91精品国产麻豆| 久久久欧美精品| 亚洲福利专区| 亚洲制服欧美中文字幕中文字幕| 欧美日韩少妇| 亚洲欧美国产日韩天堂区| 久久成人18免费网站| 狠色狠色综合久久| 欧美chengren| 日韩一区二区高清| 亚洲欧美色婷婷| 国产在线观看精品一区二区三区| 久久精品国产久精国产思思| 久久最新视频| 亚洲精品黄色| 国产精品av久久久久久麻豆网| 亚洲一区二区三区久久| 久久精品国产一区二区三区免费看| 国产精品一二三四| 久久久久免费视频| 亚洲激情网站| 小黄鸭视频精品导航| 国内综合精品午夜久久资源| 欧美激情综合在线| 1024欧美极品| 欧美精品成人91久久久久久久| 亚洲精品一区二区三| 欧美一级大片在线观看| 在线精品国产成人综合| 欧美日韩1区2区| 欧美一区二区三区日韩视频| 毛片基地黄久久久久久天堂| 亚洲精选国产| 国产亚洲毛片在线| 欧美精品一区三区| 久久成人资源| 一本久道久久综合婷婷鲸鱼| 久久国产免费| 在线亚洲欧美| 在线日韩中文| 国产精品自在欧美一区| 欧美精品成人一区二区在线观看| 午夜伦理片一区| 亚洲美女在线看| 欧美高清成人| 久久福利毛片| 亚洲一区免费观看| 亚洲国产另类久久久精品极度| 国产精品豆花视频| 欧美电影免费观看大全| 久久精品二区三区| 午夜影院日韩| 亚洲综合欧美日韩| 在线中文字幕一区| 99精品国产在热久久婷婷| 亚洲高清视频在线观看| 美女91精品|