乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      0長度數組

       kylin_1983 2014-06-24
       0長度數組是個奇怪的東西, 下面的代碼(兩種形式之一)是可以通過編譯的.
                      char buf[];
         或者
                      char buf[0];
         有什么用處呢? 大家知道數組名其實是數組所在內存的首地址, 那么0長度數組的名字,其實是在內存某個地方中作了一個標記, 在適合的時候將這個標記后面的一段內存作為這個數組的內容. 貌似數組下標溢出了,但是善于利用這點可以實現一個”變長”結構體.

      例如下面的代碼:



      CODE:#include <stdio.h>
      #include <stdlib.h>
      #include <string.h>

      static const size_t def_name_len = 32 ;
      typedef struct __Name
      {
              size_t index;
              size_t len;
              char buf[0];
      } Name, *PName ;

      Name * createName(size_t index, const char * strname)
      {
              size_t len;        
              PName pname = NULL;
              
              if (strname == NULL)
              {
                      len = def_name_len;
                     
              else
              {
                      len = strlen(strname);
              }
              
              pname = (PName) malloc( sizeof(Name) + len + 1);  
              
              if(pname == NULL) return NULL;

              pname->index = index;
              pname->len = len;
              pname->buf[0] = '\0';
              if (strname)  strncpy(pname->buf, strname, len+1);
              return pname;
      }

      void freeName(PName pname)
      {
              if(pname == NULL) return;
              free(pname);
              pname = NULL;
      }

      int main()
      {
              int i;

              PName namelist[4] = {
                      createName(1, "name1"),
                      createName(2, "name2"),
                      createName(3, "name3"),
                      createName(4, "name4"),
              };
              
              for(i=0; i<4; ++i)
              {
                      if(namelist[i])
                              printf("index %u \t name: %s \n", namelist[i]->index, namelist[i]->buf);
              }
              for(i=0; i<4; ++i)
              {
                      freeName(namelist[i]);
              }
              return 0;
      }
      struct __Name有三個成員size_t index; size_t len; char buf[0]; 但是sizeof(Name)的結果是8, 為什么呢?因為上面說了,” 0長度數組的名字,其實是在內存某個地方中作了一個標記”, 所以不占空間, 上面代碼中的pname = (PName) malloc( sizeof(Name) + len + 1);  一行,申請了一個Name結構體變量,然后這塊內存后面緊跟了一塊長len+1的內存,所以我們就可以用buf[0..len]來訪問這段內存了. 圖示如下:



      CODE:-------------------------------------------------------------------------
       index (4byte) | len (4byte)  |<------- len+1 byte -------->|
      -------------------------------------------------------------------------
      | <----------Name-------------->|                    
                                      |<-----buf[len+1] ------------|
          可見, 原理用一句話來總結,就是利用數組下標”故意”溢出來訪問數組首地址后的內存.

        本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯系方式、誘導購買等信息,謹防詐騙。如發(fā)現有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多