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

攀升·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的數轉換成一個字符串。其它什么都不想?,F在讓我們來仔細品讀里面的東西。

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

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

        輸出會讓我大吃一驚,輸出結果一樣。原因很簡單,就是printf先求b,把值給了那個static,然后再求a, 把值又給了static,static的那塊內存最終被寫入了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久久综合婷婷 | 欧美韩日精品| 亚洲综合精品| 亚洲午夜高清视频| 欧美一区激情| 久久影院午夜论| 亚洲高清二区| 美国十次成人| 亚洲福利在线观看| 99国产麻豆精品| 欧美一级在线视频| 久久精品二区三区| 欧美精品播放| 国产亚洲精品久久久久动| 狠狠色综合播放一区二区| 亚洲精品在线免费观看视频| 亚洲免费视频在线观看| 久久精品中文字幕一区二区三区 | 欧美96在线丨欧| 亚洲精品中文字幕在线观看| 亚洲天堂免费在线观看视频| 久久网站热最新地址| 欧美色图首页| 黄色成人在线免费| 一本色道88久久加勒比精品| 久久精品一二三| 欧美国产日韩二区| 亚洲一区二区精品在线| 久久亚洲午夜电影| 欧美日韩精品二区| 亚洲二区在线| 久久国产加勒比精品无码| 亚洲三级免费| 久久综合九色九九| 国产欧美69| 亚洲网站在线观看| 欧美护士18xxxxhd| 久久精品一本| 国产乱肥老妇国产一区二| 一本在线高清不卡dvd | 欧美日韩一区二区在线观看视频| 国产网站欧美日韩免费精品在线观看| 亚洲黄色免费网站| 免费观看亚洲视频大全| 中文亚洲字幕| 欧美午夜女人视频在线| 亚洲精品国久久99热| 久久99伊人| 亚洲综合日韩在线| 欧美午夜精彩| 这里是久久伊人| 亚洲三级视频在线观看| 欧美大片免费看| 日韩视频精品| 亚洲日本va午夜在线影院| 欧美成人精品1314www| 亚洲激情国产精品| 亚洲福利精品| 欧美久久在线| 亚洲深夜福利| 日韩一二三区视频| 国产精品www994| 亚洲一区久久久| 亚洲一区二区日本| 国产精品资源| 久久天天狠狠| 免费欧美日韩| 在线视频欧美日韩精品| 一区二区欧美在线| 国产精品亚洲成人| 久久九九99视频| 久久久久久久久岛国免费| 影音先锋久久| 亚洲精品乱码久久久久久| 国产精品国产三级国产普通话蜜臀| 亚洲一区二区3| 欧美一区免费| 亚洲精品国产欧美| 亚洲一区二区不卡免费| 国产亚洲精品aa| 久久久精品tv| 欧美极品在线观看| 鲁大师成人一区二区三区| 国产欧美成人| 免费在线亚洲欧美| 欧美韩日一区二区三区| 亚洲欧美视频一区| 久久国产精品一区二区三区| 亚洲黄色视屏| 午夜精品福利一区二区三区av| 伊人久久综合| 一区二区冒白浆视频| 国语精品中文字幕| 亚洲三级免费| 激情欧美一区二区| av成人动漫| 亚洲国产精品传媒在线观看| 夜久久久久久| 在线观看91精品国产麻豆| 夜夜嗨av一区二区三区四区| 激情视频一区二区| 日韩亚洲精品电影| 在线免费精品视频| 亚洲五月婷婷| 日韩亚洲欧美一区二区三区| 性欧美长视频| 亚洲夜间福利| 欧美国产视频日韩| 欧美 日韩 国产一区二区在线视频| 欧美日韩一区在线观看| 免费在线欧美视频| 国产精品免费在线| 亚洲精品美女久久7777777| 在线成人h网| 性亚洲最疯狂xxxx高清| 亚洲一区二区三区视频| 欧美xart系列高清| 欧美大胆a视频| 国内自拍亚洲| 久久精品国产99| 久久精品观看| 国产精品三区www17con| 日韩视频一区二区| 亚洲精品麻豆| 女生裸体视频一区二区三区| 久久精品欧美日韩精品| 国产精品私人影院| 亚洲在线中文字幕| 亚洲欧美日韩网| 国产精品第一区| 一区二区不卡在线视频 午夜欧美不卡在 | 欧美成人视屏| 欧美激情va永久在线播放| 激情文学综合丁香| 欧美在线观看一二区| 翔田千里一区二区| 欧美午夜久久久| 亚洲视频一区在线| 亚洲丝袜av一区| 欧美日韩在线亚洲一区蜜芽| 亚洲毛片一区二区| 亚洲欧美日韩国产一区| 亚洲欧洲一级| 国产精品久久久久毛片软件| 一区二区三区欧美视频| 亚洲自拍偷拍麻豆| 国产精品一区免费视频| 亚洲欧美国产视频| 欧美一区二区视频在线| 国产欧美一区二区三区在线老狼 | 久久视频在线免费观看| 狠狠色噜噜狠狠狠狠色吗综合| 久久久国产一区二区三区| 美女精品自拍一二三四| 亚洲第一在线视频| 欧美激情精品久久久久久免费印度| 欧美激情一区二区在线| 亚洲乱码国产乱码精品精98午夜| 欧美日韩激情小视频| 亚洲欧美www| 免费在线亚洲欧美| 一本色道久久88综合亚洲精品ⅰ| 国产精品电影在线观看| 久久精品欧洲| 最近看过的日韩成人| 西西裸体人体做爰大胆久久久| 韩国v欧美v日本v亚洲v| 欧美成人一区二免费视频软件| 一区二区三区你懂的| 久久综合免费视频影院| 一区二区动漫| 精品91久久久久| 欧美日韩黄色大片| 久久久久久久久久久久久9999| 亚洲精品免费电影| 久久久国产午夜精品| 一本色道久久综合亚洲精品按摩 | 亚洲一区二区av电影| 在线观看视频亚洲| 欧美日韩黄色大片| 久久在线观看视频| 亚洲免费视频在线观看| 亚洲第一天堂av| 久久精品国亚洲| 一区二区日韩精品| 一色屋精品视频在线观看网站| 欧美日韩大陆在线| 久热精品视频在线免费观看| 亚洲尤物视频在线| 亚洲精品欧美精品| 亚洲成人资源| 亚洲黄色影院| 欧美在线视频日韩| 亚洲色图制服丝袜| 亚洲区第一页| 亚洲福利小视频| 黄色亚洲精品| 国产一区二区黄色| 国产精品揄拍一区二区| 国产精品成人播放|