这几天在看一个开源驱动例子,遇到了这么一个奇葩的写法,本人实在不能理解。
首先,结构体声明如下:
首先,结构体声明如下:
/* Registry event */ typedef struct _REGISTRY_EVENT { REG_NOTIFY_CLASS eventType; TIME_FIELDS time; HANDLE processId; ULONG dataType; ULONG dataLengthB; ULONG registryPathLengthB; /* Contains path and optionally data */ UCHAR registryData[]; } REGISTRY_EVENT, * PREGISTRY_EVENT;
可以看到 registryData 成员是一个没有指定长度的,假如就单独这一个成员,sizeof 大小就是 1 个字节。这个代码假如在 VC 编译时,警告级别设置为 4,就编译不过去。而假如把警告级别设置为 3,则可以编译通过。这本人还不吃惊,吃惊的是后面给这个成员赋值的情况。
如图,结构体声明后,直接给这个成员拷贝数据,而且还可以用下标索引位置赋值。既然没指定长度,那么声明 REGISTRY_EVENT 结构体的时候,只给最后一个成员分配了一个字节的内存。这样直接拷贝大量数据进去,莫非不会破坏后面的内存数据吗?
解决方案
20
帮结帖+蹭分
10
搜下柔性数组
20
帮结帖