BITMAPINFO
结构具有以下声明
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
为什么RGBQUAD
数组是静态的?为什么它不是指针?
答案 0 :(得分:5)
声明变量大小的结构是一种标准技巧。颜色表从不只有一个条目,对于单色位图至少有2个,对于8bpp位图通常为256,等等。由bmiHeader.biClrUsed成员指示。所以struct的实际大小取决于位图格式。
由于C语言不允许声明这样的数据结构,因此这是最接近的匹配。创建结构需要malloc()分配足够的字节来存储结构,从biClrUsed计算。然后一个简单的强制转换为(BITMAPINFO *)使其可用。
答案 1 :(得分:1)
无论是静态与否都无关紧要。问题是,你仍然需要为调色板分配足够的内存。这是一个RGBQuad,因为它只存储R,G,B,A而已......
示例:
for(i = 0; i < 256; i++)
{
lpbmpinfo->bmiColors[i].rgbRed = some_r;
lpbmpinfo->bmiColors[i].rgbGreen = some_g;
lpbmpinfo->bmiColors[i].rgbBlue = some_b;
lpbmpinfo->bmiColors[i].rgbReserved = 0;
}
答案 2 :(得分:1)
声明中没有static
关键字。这是一个完全普通的struct成员。它用于声明一个可变大小的结构,最后带有一个可变大小的数组
仅在编译时才知道数组的大小,但是由于arrays of size 0 are forbidden in C and C++,所以我们将改用array[1]
。请参见Why do some structures end with an array of size 1?
在某些编译器(例如GCC零长度数组)上,可以将其作为扩展名,因此Linux和许多其他平台通常使用array[0]
而不是array[1]
在GNU C中允许声明零长度数组作为扩展。零长度数组可以用作结构的最后一个元素,该结构实际上是可变长度对象的标头:
struct line { int length; char contents[0]; }; struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length); thisline->length = this_length;
在C99中,引入了称为flexible array member的新功能。从那时起,最好使用array[]
来实现可移植性
struct vectord {
size_t len;
double arr[]; // the flexible array member must be last
};
另请参见