看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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