Code Bye

结构体数组不指定长度直接拷贝数据不会破坏内存吗

这几天在看一个开源驱动例子,遇到了这么一个奇葩的写法,本人实在不能理解。
首先,结构体声明如下:
/* 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

帮结帖

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明结构体数组不指定长度直接拷贝数据不会破坏内存吗