奶头挺立呻吟高潮av全片,成人试看120秒体验区,性欧美极品v,A片高潮抽搐揉捏奶头视频

C語言

C語言課程的Struct Hack筆記

時間:2024-10-02 21:32:59 C語言 我要投稿
  • 相關(guān)推薦

C語言課程的Struct Hack筆記

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

C語言課程的Struct Hack筆記

  復(fù)制代碼 代碼如下:

  int [] array;

  array = new int[10];

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

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

  復(fù)制代碼 代碼如下:

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

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

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

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

  復(fù)制代碼 代碼如下:

  int array[10];

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

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

  我們應(yīng)該怎么做?

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

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

  復(fù)制代碼 代碼如下:

  size_t _msize(

  void *memblock

  );

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

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

  復(fù)制代碼 代碼如下:

  //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的分配策略不能使得內(nèi)存大小和元素個數(shù)一一對應(yīng),此法不可用。 后來發(fā)現(xiàn)在Linux下原來也有類似_msize的函數(shù)[malloc.h]:

  復(fù)制代碼 代碼如下:

  int * array;

  int size;

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

  size = malloc_usable_size(array);

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

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

  復(fù)制代碼 代碼如下:

  typedef struct array{

  int size;

  int free;

  int buf[];

  }array,*Tiger_array;

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

  復(fù)制代碼 代碼如下:

  Tiger_array ta;

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

  ta->size = 100;

  ta->free = 0;

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

  這個問題就說到這里。

【C語言課程的Struct Hack筆記】相關(guān)文章:

c語言課程設(shè)計報告08-02

C語言的專業(yè)課程簡介09-24

C語言和C++的分別06-18

C語言的結(jié)構(gòu)10-14

C語言考點精選06-29

C語言的應(yīng)用05-29

C語言試題08-02

什么是C語言07-27

C語言試題11-01

怎樣學(xué)習(xí)c++c語言編程10-26

主站蜘蛛池模板: 大邑县| 习水县| 米脂县| 沁水县| 平塘县| 河南省| 顺义区| 衢州市| 常山县| 海盐县| 奉新县| 莒南县| 车致| 临城县| 蓬安县| 洛扎县| 平乡县| 乌兰县| 陵川县| 长顺县| 济宁市| 绥化市| 海盐县| 金平| 西宁市| 姚安县| 周口市| 蒙城县| 秦皇岛市| 彭水| 梓潼县| 齐河县| 靖州| 北海市| 松阳县| 普洱| 荆州市| 南京市| 布尔津县| 镇雄县| 赣州市|