作者purpose (purpose)
看板C_and_CPP
標題Re: [問題] 柔性陣列用途
時間Wed Apr 20 22:21:02 2011
※ 引述《tropical72 (藍影)》之銘言:
: 近來翻了本書介紹 C 一些技巧/注意事項,
: 其中提到了柔性陣列
: typedef struct tagFArray{
: int num;
: int arr[0];
: }FArray;
: #define N 100
: FArray f = (tagFarray*)malloc(sizeof(FArray) + N*sizeof(int));
: for(int i=0; i!=N; ++i) f->arr[i] = i;
: 這種方式似乎與 struct 用 int* arr = (int*)malloc(sizeof(int)); 沒兩樣,
: 但一直感覺不出它的方便性 (也可能是我都沒用過)
: 不知有經驗 / 其它想法的版友能否提示, 在哪種地方看過?
: 謝謝各位指教
重點在於,供給者跟消費者是不同的兩幫人馬。
你這裡 f 是自己建的,然後用的人又是你,才會沒效果。
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
這個結構是用來存函數資訊。
比如
第一個函數 Hint = 11; Name = "CreateDialog"; 總共需要 2+12 = 14 Bytes
第二個函數 Hint = 22; Name = "sleep"; 總共需要 2+6 = 8 Bytes
這些資料,由供給方資料記載到檔案。
檔案還面會有一個表格,分別記下第一個函數在檔案內的位置 (offset of 函數1)、
第二個函數在檔案內的位置 (offset of 函數2)。
消費方使用時,就將整個檔案載入到記憶體
而因為前面的那個表格,所以可以得到兩組記憶體位址 p1、p2
p1 與 p2 的資料型態是:
PIMAGE_IMPORT_BY_NAME p1, p2;
則這樣寫
puts(p1->Name);
puts(p2->Name);
就能抓出每一個函數的名稱,因為 C-Style 字串找到 '\0' 就停止。
如果想要抓 Hint 值,也能用 p1->Hint; p2->Hint;
只要供給方把檔案準備好,並且把 IMAGE_IMPORT_BY_NAME 這個結構
的原型宣告公佈出去即可。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 124.8.136.205
→ purpose:如果不用這樣的struct,就必須記下4個位址,前2位址分別是 04/20 22:31
→ purpose:函數1的Hint、函數2的Hint;後兩位址是函數1,2的名稱 04/20 22:31
→ purpose:浪費記錄空間 04/20 22:31
推 tropical72:謝謝p大指導 ^^ 04/20 23:04
推 softwind:應該是 client side and server side吧 XD 04/20 23:36
推 VictorTom:印象中之前也是聽過network package的結構可能會這樣用, 04/20 23:40
→ VictorTom:struct前面放header, 然後 BYTE payload[0]; 放最後面. 04/20 23:41
→ VictorTom:以前是知道說C能這樣寫C++不行; 不過現在新一點的標準 04/20 23:42
→ VictorTom:C99標準就禁止這樣用了@_@" 04/20 23:42
推 cole945:因為legacy code用蠻多zero-length array的,所以像gcc/vc 04/20 23:43
→ cole945:預設都是允許這樣用. 除非是考慮到C++與paylaod的align問 04/20 23:43
→ cole945:題, 例如後面是 uint64_t, 若不故意放 [1]造成align的效果 04/20 23:44
→ cole945:payload的align會有問題. 輕則效率差,重則exception 04/20 23:46
推 VictorTom:有道理, 倒是沒想到樓上說的align的問題....:) 04/21 00:33
推 Donze:"CreateDialog"是不是要13個byte阿? 04/21 10:03
→ purpose:少算了,感謝指正 04/21 10:17