推 tropical72:謝謝 C 大說明 ^^ 04/20 22:01
※ 引述《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