followed ASD's post...
> typedef struct tagPALETTEENTRY {
> BYTE peRed;
> BYTE peGreen;
> BYTE peBlue;
> BYTE peFlags;
> } PALETTEENTRY; //這個結構有 4 byte
> typedef struct tagLOGPALETTE {
> WORD palVersion;
> WORD palNumEntries;
> PALETTEENTRY palPalEntry[1];
> } LOGPALETTE,far *LPLOGPALETTE;
> //這個結構共8 byte
> void main()
> {
> LPLOGPALETTE ptr;
> ptr=(LOGPALETTE*)malloc(sizeof(LOGPALETTE)+
> 256*sizeof(PALETTEENTRY));
> for (int i=0;i<256;i++)
> ptr->palPalEntry[i].peFlags=0;
> }
> 1. 請教一下:
> malloc共配置 8+4*256=1032 byte
> 既然malloc傳回LOGPALETTE結構的指標
> 那麼ptr應該是指向共129個LOGPALETTE結構才對!
> 那我們為什麼可以用到 ptr->palPalEntry[0~255]個陣列?
要回達這個問題前, 先看一下第2題的回答, 您就懂了!!
看完第2題了嗎? OK, 來看看這個資料結構的真正形態, 應該是
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY palPalEntry[0];
PALETTEENTRY palPalEntry[1];
PALETTEENTRY palPalEntry[2];
....
PALETTEENTRY palPalEntry[256];
從WORD PalVersion到PALETTEENTRY palPalEntry[0];的部份, 在malloc是被
sizeof(LOGPALETTE)宣告的! 後面palPalEntry[1]到palPalEntry[256], 是被
256*sizeof(PALETTEENTRY));宣告出來的! 然後這一大筆資料變成一個
LOGPALETTE*的指標, 回傳給ptr. 這樣不知道容不容易了解...
把malloc的下一行拿掉, 你就看得懂了!!
ptr=(LOGPALETTE*)malloc(sizeof(LOGPALETTE))
看懂後再加上去就OK!
> 2.
> 既然LOGPALETTE只宣告一個PALETTEENTRY
> 那乾脆寫成 PALETTEENTRY palPalEntry ;就好了
> 為什麼要寫成 PALETTEENTRY palPalEntry[1] 呢??
因為這樣宣告後, palPalEntry是一個PALETTEENTRY *的指標! 而不是一筆
PALETTEENTRY的資料! 目的是為了做到第1個問題的效果!
> 3. 根據程式寫法,好像ptr是:
> 指向2個word以及256個PALETTEENTRY結構是嗎?
> 請教教我,我真的看不懂!
Yes! 但不是256個PALETTEEBTRY, 而是257個!(加上LOGPALETTE中的那一個)
Alex Li
--
* Origin: CHU PowerBBS (中華大學方城資訊站) <b...@bbs.chpi.edu.tw>