Visual c++ 在ddk结构中使用一个元素的数组有什么意义?
这里是从ntdddisk.h摘录的Visual c++ 在ddk结构中使用一个元素的数组有什么意义?,visual-c++,wdk,Visual C++,Wdk,这里是从ntdddisk.h摘录的 typedef struct _DISK_GEOMETRY_EX { DISK_GEOMETRY Geometry; // Standard disk geometry: may be faked by driver. LARGE_INTEGER DiskSize; // Must always be
typedef struct _DISK_GEOMETRY_EX {
DISK_GEOMETRY Geometry; // Standard disk geometry: may be faked by driver.
LARGE_INTEGER DiskSize; // Must always be correct
UCHAR Data[1]; // Partition, Detect info
} DISK_GEOMETRY_EX, *PDISK_GEOMETRY_EX;
UCHAR数据的意义是什么[1]代码>?为什么不仅仅是UCHAR数据代码>?
DDK中有很多结构,在声明中有一个元素的数组
谢谢,现在清楚了。有一件事是不清楚的实施抵消。
它的定义是
#ifdef _WIN64
#define offsetof(s,m) (size_t)( (ptrdiff_t)&(((s *)0)->m) )
#else
#define offsetof(s,m) (size_t)&(((s *)0)->m)
#endif
工作原理:
((s*)0)->m
这个
就像
sizeof (DISK_GEOMETRY) + sizeof( LARGE_INTEGER);
但还有两个问题:
(一)
这是什么类型的?为什么我们要用&来做这个
((DISK_GEOMETRY_EX *)0)->Data
2) ((磁盘几何体)0)
这给了我一百万。它是否转换为地址对齐?将其解释为地址?在winapi中也很常见,它们是可变长度的结构。数组始终是结构中的最后一个元素,并且它始终包含一个指示实际数组大小的字段。例如,位图是这样声明的:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;
颜色表的条目数可变,单色位图为2条,4bpp为16条,8bpp位图为256条。由于结构的实际长度不同,因此不能声明该类型的变量。编译器不会为它保留足够的空间。因此,您始终需要免费商店使用如下代码分配:
#include <stddef.h> // for offsetof() macro
....
size_t len = offsetof(BITMAPINFO, bmiColors) + 256 * sizeof(RGBQUAD);
BITMAPINFO* bmp = (BITMAPINFO*)malloc(len);
bmp->bmiHeader.biClrUsed = 256;
// etc...
//...
free(bmp);
#包含//用于offsetof()宏
....
size_t len=偏移量(位图信息,bmiColors)+256*sizeof(RGBQUAD);
BITMAPINFO*bmp=(BITMAPINFO*)malloc(len);
bmp->bmiHeader.biClrUsed=256;
//等等。。。
//...
自由基(bmp);
#include <stddef.h> // for offsetof() macro
....
size_t len = offsetof(BITMAPINFO, bmiColors) + 256 * sizeof(RGBQUAD);
BITMAPINFO* bmp = (BITMAPINFO*)malloc(len);
bmp->bmiHeader.biClrUsed = 256;
// etc...
//...
free(bmp);