我有下一个结构

typedef struct _COMMAND_MESSAGE {
    R_COMMAND Command;
    size_t DataLength;
    UCHAR Data[];
} COMMAND_MESSAGE, *PCOMMAND_MESSAGE;

我使用数据作为缓冲区在内核和用户模式之间传递数据。现在我想从缓冲区读取一个宽字符串。
// 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]);

如何从命令->数据长度初始化已知长度的wchar数组?我不知道在编译时最大字符串大小。有时候会很巨大。

最佳答案

从错误消息中可以看出您正在使用Microsoft编译器。可变长度数组是在C99语言标准中添加的,Microsoft不完全支持该标准。要解决此问题,需要在动态存储(堆)中分配MyMessage2,如下所示:

wchar_t MyMessage2* = malloc(cmd->DataLength * sizeof(*MyMessage2));
... // Use the buffer here
free(MyMessage2);

我不知道在编译时最大字符串大小。有时候会很巨大。
然后,即使使用标准兼容编译器,也应该使用动态存储方法。当自动存储(堆栈)中的可变长度数组有时可能很大时,永远不要在其中分配该数组,因为尝试在堆栈上分配大数组可能会导致堆栈溢出和运行时崩溃。通常,动态存储允许您分配比自动存储更多的内存。

07-26 09:42