看板 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)); 沒兩樣, : 但一直感覺不出它的方便性 (也可能是我都沒用過) : 不知有經驗 / 其它想法的版友能否提示, 在哪種地方看過? : 謝謝各位指教 這是用C/C++不檢查邊界的特性搞出來的東西... 好處在於你可以隨便分一塊夠大的記憶體, 當成後台。然後套用不同陣列下去玩。 比如說: #define LEN_IN_BYTE 65536 typedef struct {int nLen; long nArr[1];} longarr_t; typedef struct {int nLen; char nArr[1];} chararr_t; char *pBack=(char *)malloc(LEN_IN_BYTE*sizeof(char)+sizeof(int)); longarr_t *pArr0=(longarr_t *)pBack; chararr_t *pArr1=(chararr_t *)pBack; pArr0->nLen=100; pArr0->nArr[0]=...; ... pArr1->nLen=400; pArr1->nArr[0]=...; ... 這在寫Driver或Firmware時常用, 因為常常用同一塊記憶體當成不同函數的工作區來用。 有一定的便利性, 但是要是不小心會讓程式更亂。當你記憶體有限(如核心模式), 就會常 常這樣用了, 如果有看過WDM, 應該對那塊DriverObject印象深刻(每個IRP都拿它來輸出入 )。 --               裸になって                                                   何が悪い?      -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.57.76
tropical72:謝謝 C 大說明 ^^ 04/20 22:01