Visual c++ 在ddk结构中使用一个元素的数组有什么意义?

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

这里是从ntdddisk.h摘录的

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);