我有下一个结构
typedef struct _COMMAND_MESSAGE {
R_COMMAND Command;
size_t DataLength;
UCHAR Data[];
} COMMAND_MESSAGE, *PCOMMAND_MESSAGE;
我使用Data作为缓冲区在内核和用户模式之间传递数据。现在我想从缓冲区读取一个宽字符串。
// wchar_t MyMessage2[100]; - Works
wchar_t MyMessage2[cmd->DataLength]; //C2466: An array is allocated or declared with size zero.
int byte_offset = 0;
// read message from the data stream
wcscpy(MyMessage2, (wchar_t*)&cmd->Data[byte_offset]);
如何从cmd-> DataLength初始化已知长度的wchar数组?我不知道在编译时最大字符串大小。有时可能会很大。
答案 0 :(得分:3)
从错误消息中可以看出您使用的是Microsoft编译器。可变长度数组是在C99语言标准中添加的,Microsoft并不完全支持。要解决此问题,您需要在动态存储(堆)中分配MyMessage2
,如下所示:
wchar_t MyMessage2* = malloc(cmd->DataLength * sizeof(*MyMessage2));
... // Use the buffer here
free(MyMessage2);
我不知道在编译时最大字符串大小。有时可能会很大。
然后,即使使用符合标准的编译器,也应该使用动态存储方法。当有时可能存在巨大的数据时,你永远不应该在自动存储(堆栈)中分配一个可变长度数组,因为在堆栈上分配大数组的尝试可能导致堆栈溢出和运行时崩溃。通常,动态存储允许您分配比自动存储更多的内存。