结构传递给函数后大小不同
Struct has different size after being passed to func
我创建了一个带有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);
}
在上面的函数中,size是12,而在接收函数中,size只有4。该结构体声明为主程序的全局变量。
在函数中,您取的是void*
的大小,而不是dataPacketDef
的大小。显然,在您的系统上,sizeof(void*)
是4字节。sizeof
操作符仅仅是类型驱动的:它不会对点进行神奇的检查。实际上,由于您已经使用过时的强制转换执行了类型擦除,因此不能。
不能以这种方式序列化对象。这个列表不是扁平的数据;它的元素实际上不是dataPacketDef
的一部分,而是动态分配的。列表保存着指向这些元素的指针。你所做的只是序列化指针,这些指针在目标系统上立即变得没有意义。
完全放弃这种方法,并研究如何在现代c++中正确地序列化对象。
在作为void类型传递给函数之前,它是12。一旦进入函数,它就是4
因为sizeof指针在你的程序的情况下是4个字节,你不能读取sizeof结构如果你将你的结构的实例强制转换为void*。你可以通过传递给你的函数也你的结构体的大小foo(static_cast<void*>(&myStructObj), sizeof(TypeOfMyStruct))
来修复它。
也正如Lightness Races in Orbit在他的回答中指出的,序列化std::list是错误的,你只会写指针到你的文件/
指针的大小为4字节(如果使用x64编译器则为8字节)。如果writeData
需要知道指向对象的大小,则需要将该信息以某种方式传递给它;一个常见的习惯用法是将大小作为第二个参数传递。完成这些后,您可以使用辅助函数模板来简化:
template<typename T>
void writeData(Client& client, const T& obj)
{
client.writeData((void*)&obj, sizeof(obj));
}
尽管molbdnilo在问题评论中指出,由于dataPacketDef
中存在list
, client.writeData()
可能仍然无法做你想做的事情。
正确。
指针总是包含一个地址,在你的机器上是4个字节。
因此,在32位寻址架构下,任何指针的大小都是4字节。
sizeof(void*)在32位机器上是4字节
- 使用不带参数的函数访问结构元素
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 链表,反向函数,数据结构
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 需要帮助将结构数组传递给函数
- 使用cpp中的结构和函数的多个学生条目
- 如何传递带有通过引用传递的结构参数的函数?
- 在类构造函数中使用结构变量
- 在 c++ 中将变量作为结构构造函数中的引用传递
- 在类构造函数中定义结构变量的参数
- 如何在模板类函数中分配结构值?
- 我应该在C++中将这些结构用作参数化构造函数吗?
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 在结构外部调用指向函数的指针
- 函数:结构的数组
- C++错误:只能为对象和函数结构指定存储类
- 将libuv与函数结构一起使用,而不是函数回调
- 从c#调用c++函数-结构体,指针,函数指针
- 函数结构数组输入cin问题