a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

C語言的Struct Hack筆記

2020-01-26 15:32:06
字體:
來源:轉載
供稿:網友

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

復制代碼 代碼如下:

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("%d/n",sizof(array)/sizeof(int)); // 1

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

int array[10];
printf("%d/n",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("%d/n",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)加上需求的數組大小。

這個問題就說到這里。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 超碰人人干 | 亚洲高清av | 久久久久久一区 | 一级做a爰 | 国产色| 亚洲精品一区二区三区四区高清 | 97国产精品人人爽人人做 | 国产精品美女一区二区三区四区 | 日韩高清在线播放 | 涩综合 | 亚洲中字幕女 | 久久久精品网站 | 81精品国产乱码久久久久久 | 97国产一区二区精品久久呦 | 蜜桃视频在线观看www社区 | 午夜视频在线 | 91一区二区 | 亚洲 欧美 在线 一区 | 精品视频免费观看 | 91色站| 日韩黄色在线 | 欧美精品99| 免费a级作爱片免费观看欧洲 | 凹凸日日摸日日碰夜夜爽孕妇 | 超碰免费在线观看 | 在线视频亚洲 | 国产精品欧美一区二区三区 | 成人久久久精品乱码一区二区三区 | 欧美视频一区二区三区在线观看 | 国产激情美女久久久久久吹潮 | 成人不卡视频 | 正在播放国产精品 | 中文字幕第一页久久 | 看黄色.com | 亚洲免费视频网站 | 青草成人免费视频 | 亚洲视频在线观看 | 精品一区二区三区免费 | jjzz日本 | 日韩久久一区二区 | 日韩久久久精品 |