最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言的Struct Hack筆記

 更新時(shí)間:2014年04月28日 08:52:59   作者:  
這篇文章主要介紹了C語言的Struct Hack例子,個(gè)人的一篇筆記,需要的朋友可以參考下吧

最近在搞Compiler的CodeGenerator實(shí)驗(yàn),有一部分需要把Java程序翻譯成C程序,比如:

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

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

int array[10];
printf("%d\n",sizof(array)/sizeof(int)); // 10

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

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

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

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

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

size_t _msize(
void *memblock
);


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

在Linux下,指針往前偏移一個(gè)整形大小的單元也會(huì)記錄實(shí)際分配的大小,我們來窺探一下那個(gè)單元的內(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)存大小和元素個(gè)數(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("%d\n",size);//50

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

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

typedef struct array{
 int size;
 int free;
 int buf[];
 }array,*Tiger_array;


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

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

 Tiger_array ta;
ta = (int*)malloc(sizeof(array)+100);
ta->size = 100;
ta->free = 0;

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

這個(gè)問題就說到這里。

相關(guān)文章

  • C++實(shí)現(xiàn)WebSocket服務(wù)器的案例分享

    C++實(shí)現(xiàn)WebSocket服務(wù)器的案例分享

    WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的通信協(xié)議,與HTTP協(xié)議不同,它允許服務(wù)器主動(dòng)向客戶端發(fā)送數(shù)據(jù),而不需要客戶端明確地請求,本文主要給大家介紹了C++實(shí)現(xiàn)WebSocket服務(wù)器的案例,需要的朋友可以參考下
    2024-05-05
  • C++基于消息隊(duì)列的多線程實(shí)現(xiàn)示例代碼

    C++基于消息隊(duì)列的多線程實(shí)現(xiàn)示例代碼

    這篇文章主要給大家介紹了關(guān)于C++基于消息隊(duì)列的多線程實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • C語言實(shí)現(xiàn)圖的遍歷之深度優(yōu)先搜索實(shí)例

    C語言實(shí)現(xiàn)圖的遍歷之深度優(yōu)先搜索實(shí)例

    這篇文章主要介紹了C語言實(shí)現(xiàn)圖的遍歷之深度優(yōu)先搜索實(shí)例,采用不同的方法實(shí)現(xiàn)了深度優(yōu)先搜索算法,有不錯(cuò)的借鑒價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C/C++實(shí)現(xiàn)俄羅斯方塊游戲

    C/C++實(shí)現(xiàn)俄羅斯方塊游戲

    這篇文章主要介紹了如何利用C/C++實(shí)現(xiàn)經(jīng)典游戲之一的俄羅斯方塊,文中的實(shí)現(xiàn)步驟講解詳細(xì),對我們學(xué)習(xí)C語言和C++有一定的幫助,需要的可以參考一下
    2022-02-02
  • C++實(shí)現(xiàn)LeetCode(111.二叉樹的最小深度)

    C++實(shí)現(xiàn)LeetCode(111.二叉樹的最小深度)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(111.二叉樹的最小深度),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++中操作符的前置與后置有什么區(qū)別

    C++中操作符的前置與后置有什么區(qū)別

    C 語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。接下了讓我們詳細(xì)了解掌握它
    2022-05-05
  • C語言實(shí)現(xiàn)用戶態(tài)線程庫案例

    C語言實(shí)現(xiàn)用戶態(tài)線程庫案例

    下面小編就為大家?guī)硪黄狢語言實(shí)現(xiàn)用戶態(tài)線程庫案例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • 詳解C++中指針和引用的區(qū)別

    詳解C++中指針和引用的區(qū)別

    這篇文章主要介紹了C++中指針和引用的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • OpenCV利用霍夫變換實(shí)現(xiàn)交通車道線檢測

    OpenCV利用霍夫變換實(shí)現(xiàn)交通車道線檢測

    經(jīng)典霍夫變換用來檢測圖像中的直線,后來霍夫變換經(jīng)過擴(kuò)展可以進(jìn)行任意形狀物體的識別,例如圓和橢圓。本文就來利用霍夫變換實(shí)現(xiàn)交通車道線檢測,需要的可以參考一下
    2022-09-09
  • 深入N皇后問題的兩個(gè)最高效算法的詳解

    深入N皇后問題的兩個(gè)最高效算法的詳解

    本篇文章是對N皇后問題的兩個(gè)最高效的算法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05

最新評論

汝城县| 奎屯市| 满城县| 新安县| 龙江县| 宜川县| 吉首市| 丁青县| 双牌县| 余庆县| 淮北市| 建阳市| 大理市| 玉山县| 柳河县| 中方县| 兴海县| 九龙县| 泰兴市| 来宾市| 札达县| 东辽县| 门源| 板桥市| 延长县| 水城县| 德阳市| 河源市| 章丘市| 巴林左旗| 恩平市| 胶州市| 绥化市| 临桂县| 新郑市| 永年县| 威远县| 澜沧| 河池市| 区。| 二连浩特市|