在传递给func之后,Struct具有不同的大小

时间:2015-05-22 19:32:21

标签: c++

我创建了一个带有Id变量和值列表的结构。当我在将函数作为void *传递给函数之前检查大小时,它是12.一旦它进入函数,它就是4.如何保持大小相同?

结构代码:

typedef struct
{
    int id;
    std::list<int> sensorValues;
}dataPacketDef;

发送到其他功能代码:

  void SendDataBufferToServer()
{
    cout << "Sending network data size: " << sizeof(dpd) << "\n";
    client.writeData((void*)&dpd);
}

在上面的函数中,大小为12,但在接收函数中,大小只有4.结构被声明为主程序的全局变量。

5 个答案:

答案 0 :(得分:3)

  

在将它作为void *传递给函数之前它是12.一旦它进入函数它就是4

因为在程序的情况下sizeof指针是4个字节,如果将结构的实例转换为void *,则无法读取sizeof结构。您可以通过传递给您的函数的结构大小即foo(static_cast<void*>(&myStructObj), sizeof(TypeOfMyStruct))来修复它。

[编辑]

同样在Orbit中的Lightness Races在他的回答中指出,序列化std :: list是错误的,你只会写指向你的文件/

答案 1 :(得分:3)

在该功能中,您的尺寸为void*,而不是dataPacketDef。而且,显然,您的系统sizeof(void*)是4个字节。 sizeof运算符只是类型驱动的:它不会对pointees进行神奇的检查。事实上,既然你已经使用过时的演员表进行了类型擦除,那么它就不能

您无法以这种方式序列化您的对象。该清单不是平面数据;它的元素实际上不是dataPacketDef的一部分,而是动态分配的。该列表包含指向这些元素的指针。您所做的只是序列化指针,这些指针在目标系统上立即变得毫无意义。

完全放弃这种方法,研究如何在现代C ++中正确地序列化对象。

答案 2 :(得分:2)

指针的大小为4个字节(如果使用的是x64编译器,则为8个字节)。如果template<typename T> void writeData(Client& client, const T& obj) { client.writeData((void*)&obj, sizeof(obj)); } 需要知道指向对象的大小,则需要以某种方式将该信息传递给它;一个常见的习惯用法是将大小作为第二个参数传递。完成后,您可以使用辅助函数模板来简化操作:

client.writeData()

虽然正如molbdnilo在问题评论中指出的那样,list可能仍然无法通过dataPacketDef class="profile"中的class="employeeul"来实现您想要的效果

答案 3 :(得分:0)

这是正确的。

指针始终包含一个地址,即机器上的4个字节。

因此,任何指针的大小在32位寻址架构上都是4个字节。

答案 4 :(得分:0)

sizeof(void *)在32位机器上是4个字节。