C++ 将void*强制转换为具有数组成员的结构

C++ 将void*强制转换为具有数组成员的结构,c++,arrays,casting,struct,void,C++,Arrays,Casting,Struct,Void,我试图直接将一个数据流强制转换到一个结构中,而这个结构实际上具有数量可变的其他结构作为成员。下面是一个例子: struct player { double lastTimePlayed; double timeJoined; }; struct team { uint32_t numberOfPlayers; player everyone[]; }; 然后我叫: team

我试图直接将一个数据流强制转换到一个结构中,而这个结构实际上具有数量可变的其他结构作为成员。下面是一个例子:

    struct player
    {
        double lastTimePlayed;
        double timeJoined;
    };

    struct team
    {
        uint32_t numberOfPlayers;
        player everyone[];
    };
然后我叫:

    team *myTeam = (cache_team*)get_stream();
这应该像某种序列化一样工作,我知道我的流的结构完全如上面所示,但是我有一个问题,numberOfPlayers是一个变量

我的流以4个字节开始,表示团队的玩家数量,然后它包含每个玩家(在本例中,每个玩家只有lastTimePlayed和TimeJoin)

发布的代码似乎正在运行,我仍然收到编译器的警告,因为默认赋值和复制构造函数,但我的问题是,是否可以用其他方法,更好的方法来实现这一点


顺便说一句,我的流实际上是一个到文件的直接映射,我的目标是像使用文件本身一样使用该结构(该部分工作正常)

uint32\u t
是4个字节。如果它以8个字节开头,则需要一个
uint64\u t

如果要消除警告,可以将默认复制和分配设置为私有:

struct team {
    // ...
private:
    team(const team &);
    team &operator=(const team &);
};
由于您可能希望以任何方式通过指针传递所有内容,这将防止意外复制


将映射指针转换为结构可能是最简单的方法。最重要的是要确保所有内容都正确排列。

Visual Studio 2012提供了以下内容:

warning C4200: nonstandard extension used : zero-sized array in struct/union
A structure or union contains an array with zero size.
Level-2 warning when compiling a C++ file and a Level-4 warning when compiling a C file.
这似乎是一个合理的信息。我建议您将结构修改为:

struct team
{
        uint32_t numberOfPlayers;
        player everyone[1];
};
这样的定义不那么优雅,但结果基本相同。C++不检查索引的值。大量的代码都在使用它


新开发应该尽可能避免“数组大小冲突”。用这种方式描述外部结构是可以接受的。

scaryrawr的解决方案和你的解决方案都能做到这一点,但事实上我正在寻找另一种方法

事实上我确实找到了。我使用了uint32\u t everyonePtr而不是数组,然后我将使用如下重新解释转换将uint32\u t转换为指针:

player*entries=reinterpret\u cast(&team->everyonePtr)


然后我的映射将按预期工作,我认为它比数组[1]甚至空数组更容易理解。谢谢你们。

你们说得对,uint32\u t是4字节:)刚刚编辑了我的问题。关于问题本身:是的,这样我就摆脱了警告,事实上这是一种方法。我肯定我不会实例化或复制这个结构。