Re: [問題] 柔性陣列用途

看板C_and_CPP (C/C++)作者 (purpose)時間15年前 (2011/04/20 22:21), 編輯推噓6(6010)
留言16則, 6人參與, 最新討論串3/3 (看更多)
※ 引述《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

04/20 22:31, , 1F
如果不用這樣的struct,就必須記下4個位址,前2位址分別是
04/20 22:31, 1F

04/20 22:31, , 2F
函數1的Hint、函數2的Hint;後兩位址是函數1,2的名稱
04/20 22:31, 2F

04/20 22:31, , 3F
浪費記錄空間
04/20 22:31, 3F

04/20 23:04, , 4F
謝謝p大指導 ^^
04/20 23:04, 4F

04/20 23:36, , 5F
應該是 client side and server side吧 XD
04/20 23:36, 5F

04/20 23:40, , 6F
印象中之前也是聽過network package的結構可能會這樣用,
04/20 23:40, 6F

04/20 23:41, , 7F
struct前面放header, 然後 BYTE payload[0]; 放最後面.
04/20 23:41, 7F

04/20 23:42, , 8F
以前是知道說C能這樣寫C++不行; 不過現在新一點的標準
04/20 23:42, 8F

04/20 23:42, , 9F
C99標準就禁止這樣用了@_@"
04/20 23:42, 9F

04/20 23:43, , 10F
因為legacy code用蠻多zero-length array的,所以像gcc/vc
04/20 23:43, 10F

04/20 23:43, , 11F
預設都是允許這樣用. 除非是考慮到C++與paylaod的align問
04/20 23:43, 11F

04/20 23:44, , 12F
題, 例如後面是 uint64_t, 若不故意放 [1]造成align的效果
04/20 23:44, 12F

04/20 23:46, , 13F
payload的align會有問題. 輕則效率差,重則exception
04/20 23:46, 13F

04/21 00:33, , 14F
有道理, 倒是沒想到樓上說的align的問題....:)
04/21 00:33, 14F

04/21 10:03, , 15F
"CreateDialog"是不是要13個byte阿?
04/21 10:03, 15F

04/21 10:17, , 16F
少算了,感謝指正
04/21 10:17, 16F
文章代碼(AID): #1DhklGYc (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):
文章代碼(AID): #1DhklGYc (C_and_CPP)