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

攀升·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>
            久久成年人视频| 午夜视频在线观看一区二区三区 | 猫咪成人在线观看| 老司机免费视频一区二区| **性色生活片久久毛片| 亚洲电影专区| 欧美日韩国产一级| 欧美亚洲免费高清在线观看| 久久大逼视频| 亚洲精品少妇| 亚洲男人第一av网站| 在线精品福利| 99国内精品久久| 国语自产在线不卡| 亚洲日韩第九十九页| 国产精品一二三| 欧美成人四级电影| 欧美亚洲成人网| 另类国产ts人妖高潮视频| 欧美高清在线| 欧美中文在线观看国产| 欧美ed2k| 欧美在线看片| 欧美日韩高清在线观看| 久久中文欧美| 国产精品美女久久久| 农夫在线精品视频免费观看| 欧美香蕉视频| 欧美粗暴jizz性欧美20| 国产精品腿扒开做爽爽爽挤奶网站 | 欧美韩日一区| 久久久www免费人成黑人精品 | 久久精品亚洲精品| 亚洲手机成人高清视频| 裸体丰满少妇做受久久99精品| 亚洲一区黄色| 欧美不卡高清| 美日韩免费视频| 国产欧美日韩激情| 一区二区国产日产| 在线精品高清中文字幕| 亚洲欧美日韩一区在线观看| 99日韩精品| 欧美福利视频网站| 麻豆精品91| 狠狠综合久久av一区二区小说| 亚洲小少妇裸体bbw| 亚洲精品免费电影| 久久亚洲综合色一区二区三区| 亚洲欧美一区二区三区在线| 欧美日韩国产成人精品| 亚洲国产精品久久人人爱蜜臀| 伊人影院久久| 久久久91精品国产一区二区精品| 午夜欧美电影在线观看| 国产精品国产三级国产aⅴ无密码| 亚洲激情社区| 夜夜嗨av色综合久久久综合网| 麻豆精品一区二区综合av| 久久综合图片| 亚洲电影免费观看高清| 久久影院午夜片一区| 老色鬼精品视频在线观看播放| 国产在线精品一区二区中文| 欧美一区二区三区免费看 | 一区二区高清视频| 欧美日本在线看| 一本一道久久综合狠狠老精东影业 | 欧美激情精品久久久久久免费印度| 嫩草成人www欧美| 亚洲韩国青草视频| 欧美大成色www永久网站婷| 91久久线看在观草草青青| 亚洲美女中文字幕| 欧美视频在线观看免费网址| 中文国产亚洲喷潮| 欧美在线一级视频| 在线观看日韩av电影| 欧美电影免费观看| 99国产精品99久久久久久| 欧美亚洲一区二区三区| 韩国欧美一区| 欧美电影免费观看| 亚洲视频在线一区| 久久久国产午夜精品| 亚洲国产精品成人精品| 欧美日韩国产三区| 亚洲免费影视| 欧美激情91| 午夜激情久久久| 在线观看亚洲一区| 国产精品久久久久9999| 久久在线精品| 一区二区三区毛片| 久久尤物电影视频在线观看| 99国产麻豆精品| 国产亚洲欧美日韩日本| 欧美人与性动交cc0o| 欧美一区二区精美| 亚洲三级视频| 久久一区亚洲| 亚洲欧美在线一区| 亚洲欧洲在线视频| 国产亚洲一区精品| 欧美日韩一区二| 久久久午夜视频| 亚洲在线不卡| 日韩视频免费看| 免费看亚洲片| 久久精品久久99精品久久| aa级大片欧美| 亚洲国产精品ⅴa在线观看 | 欧美成人tv| 久久激情视频久久| 国产精品99久久久久久久女警 | 欧美日韩黄色大片| 久久久久这里只有精品| 亚洲一区二区三区国产| 亚洲精品久久久久久久久久久久久 | 老司机午夜精品视频在线观看| 亚洲一区二区成人在线观看| 亚洲欧洲在线一区| 欧美v日韩v国产v| 久久久久久久久久久久久9999| 亚洲女同同性videoxma| 日韩午夜激情av| 91久久国产精品91久久性色| 很黄很黄激情成人| 国产一区二区三区日韩| 国产精品丝袜91| 国产精品一级| 国产日韩欧美在线观看| 国产精品一区二区三区免费观看| 欧美日韩性生活视频| 欧美日韩视频不卡| 欧美日韩一区二区在线观看视频| 麻豆成人在线观看| 麻豆91精品| 欧美99在线视频观看| 免费高清在线视频一区·| 久久久噜噜噜久噜久久 | 一本久道久久综合婷婷鲸鱼| 亚洲精品乱码| 9色精品在线| 亚洲性视频网址| 亚洲欧美日韩在线播放| 欧美一区深夜视频| 久久精品日韩欧美| 久久夜色撩人精品| 欧美国产高清| 欧美午夜无遮挡| 国产精品嫩草99av在线| 国产亚洲精久久久久久| 国一区二区在线观看| 在线精品国产成人综合| 亚洲精品久久视频| 亚洲一二三区在线| 欧美在线三级| 欧美福利电影在线观看| 91久久精品一区二区别| 正在播放亚洲一区| 欧美一区二区视频在线| 免费不卡中文字幕视频| 欧美日韩亚洲综合| 国产精品永久免费观看| 在线观看视频一区二区欧美日韩| 亚洲人妖在线| 亚洲欧美日韩国产成人| 久久免费精品日本久久中文字幕| 欧美电影免费| 亚洲字幕一区二区| 美女国产精品| 国产精品五月天| 亚洲精品1区2区| 午夜精品视频在线观看一区二区| 久久综合九色九九| 日韩视频在线观看免费| 久久精品一区蜜桃臀影院| 欧美精品麻豆| 狠狠色综合一区二区| 在线一区欧美| 蜜臀久久99精品久久久画质超高清 | 欧美一区二区视频在线| 欧美激情五月| 欧美一级在线视频| 欧美日韩日日骚| 亚洲成人资源| 久久久99爱| av成人免费在线观看| 老**午夜毛片一区二区三区| 国产精品麻豆成人av电影艾秋| 最新国产成人av网站网址麻豆| 欧美影院一区| 一本色道久久综合亚洲二区三区| 牛夜精品久久久久久久99黑人| 国产精品日日做人人爱| 在线一区视频| 亚洲韩国日本中文字幕| 久久免费视频一区| 国产一区再线|