<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
            C語言

            C語言課程的Struct Hack筆記

            時間:2025-03-01 16:09:27 C語言 我要投稿
            • 相關推薦

            C語言課程的Struct Hack筆記

              最近在搞Compiler的CodeGenerator實驗,有一部分需要把Java程序翻譯成C程序,比如:

            C語言課程的Struct Hack筆記

              復制代碼 代碼如下:

              int [] array;

              array = new int[10];

              System.out.println(array.length); //10

              這段代碼翻譯成C很自然的想法是:

              復制代碼 代碼如下:

              int * array; // int array[] not support in C

              array = (int*)malloc(sizof(int)*10);

              printf("%dn",sizof(array)/sizeof(int)); // 1

              但很可惜這樣是錯誤的,因為malloc操作在堆上分配空間,不一定是連續的,sizof(array)得到的是指針本身所占的單元,和sizeof(int)相等,無法通過sizof求得數組長度。它和下面還不一樣:

              復制代碼 代碼如下:

              int array[10];

              printf("%dn",sizof(array)/sizeof(int)); // 10

              這里array是數組,是指向整個連續存儲空間的常量,所以sizeof對其操作求得的是整個區域的長度。但是當數組名作為函數的參數傳遞時,數組就退化為指針,又回到了剛才問題。

              我們應該怎么做?

              在 StackOverflow 搜了一下,發現ANSI C根本沒有直接辦法通過指向內存的指針求得分配長度。但Windows下提供了計算指針指向的內存大小的方法[malloc.h]:

              _msize : returns the size (in bytes) as an unsigned integer.

              復制代碼 代碼如下:

              size_t _msize(

              void *memblock

              );

              但由于操作系統策略的原因,實際分配到的大小可能會比指定的大一些.

              在Linux下,指針往前偏移一個整形大小的單元也會記錄實際分配的大小,我們來窺探一下那個單元的內容:

              復制代碼 代碼如下:

              //test.c

              int main(){

              int * p;

              int i;

              int size;

              for (i=1;i<11;i++)

              printf("%d ",i);

              printf("n");

              for (i=0;i<10;i++){

              p = (int*)malloc(sizeof(int)*i);

              size = *(int*)((char*)p-sizeof(int));

              printf("size:%d ",size);

              free(p);

              }

              printf("n");

              }

              $gcc test.c

              $./a.out

              1 2 3 4 5 6 7 8 9 10

              17 17 17 17 25 25 33 33 41 41

              看來Linux的分配策略不能使得內存大小和元素個數一一對應,此法不可用。 后來發現在Linux下原來也有類似_msize的函數[malloc.h]:

              復制代碼 代碼如下:

              int * array;

              int size;

              array = (int*)malloc(sizof(50);

              size = malloc_usable_size(array);

              printf("%dn",size);//50

              但是malloc.h不屬于標準C,我們還要繼續尋找通用之法。經過大量查閱,終于發現了一種code trick,稱作struct-hack. 前面提到過,在C語言中,int a[]是違法的,但是把它作為struct的最后一個成員卻是可以的:

              復制代碼 代碼如下:

              typedef struct array{

              int size;

              int free;

              int buf[];

              }array,*Tiger_array;

              這是在C語言的后期加入的特性,目的就是為了實現flexible array, 這樣每次給數組分配空間時,需要同步記錄size大小。而求size的時候,直接取出來即可:

              復制代碼 代碼如下:

              Tiger_array ta;

              ta = (int*)malloc(sizeof(array)+100);

              ta->size = 100;

              ta->free = 0;

              需要注意一點,這時分配的大小應該是sizeof(struct)加上需求的數組大小。

              這個問題就說到這里。

            【C語言課程的Struct Hack筆記】相關文章:

            C語言結構體(struct)常見使用方法08-01

            C語言結構體(struct)常見使用方法09-15

            c語言課程的特性11-09

            c語言課程設計報告08-02

            c語言課程設計總結08-24

            C語言的專業課程簡介09-24

            試論C語言課程設計的研究與運用10-06

            淺談高職C語言課程的教學分析與設計05-18

            《C語言程序設計》課程設計報告05-22

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院