如何克服"数组被分配或声明为大小为零"限制?

时间:2014-06-18 08:47:25

标签: c

我有下一个结构

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数组?我不知道在编译时最大字符串大小。有时可能会很大。

1 个答案:

答案 0 :(得分:3)

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

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

我不知道在编译时最大字符串大小。有时可能会很大。

然后,即使使用符合标准的编译器,也应该使用动态存储方法。当有时可能存在巨大的数据时,你永远不应该在自动存储(堆栈)中分配一个可变长度数组,因为在堆栈上分配大数组的尝试可能导致堆栈溢出和运行时崩溃。通常,动态存储允许您分配比自动存储更多的内存。