当前位置: 技术问答>linux和unix
C的高手请,struct在内存中的存储格式问题
来源: 互联网 发布时间:2015-12-03
本文导语: 那位高人能帮解决一下,struct在内存中是已什么格式存储的,我在两个系统间传数据,用memcpy拷贝struct,结果在传到另一个系统时,在用memcpy拷贝回来就不正确了,请问是不是系统间struct的内存存储格式不一样? ...
那位高人能帮解决一下,struct在内存中是已什么格式存储的,我在两个系统间传数据,用memcpy拷贝struct,结果在传到另一个系统时,在用memcpy拷贝回来就不正确了,请问是不是系统间struct的内存存储格式不一样?
|
#pragma pack(1)
struct yourstruct
{
...
}
#pragma pack()
struct yourstruct
{
...
}
#pragma pack()
|
gcc
结构紧缩格式
struct __attribute__(__packet__)) struct_name
{
int a;
char b;
};
这样 sizeof(struct struct_name) = 5;
如果不加 __attribute__(__packet__))
那就是sizeof(struct struct_name) = 8 了
结构紧缩格式
struct __attribute__(__packet__)) struct_name
{
int a;
char b;
};
这样 sizeof(struct struct_name) = 5;
如果不加 __attribute__(__packet__))
那就是sizeof(struct struct_name) = 8 了
|
windows下的编译器好象都是可以指定编译时候的字节对齐方式,非windows应该也有,但是我不知道。我一般用#pragma pack 来把struct包含起来,这样不管什么平台对齐方式都一样了。具体什么对齐方式,你可以打印里面的地址来看下
|
结构主要是成员对齐方式的问题。不同的编译器采用的对齐方式可能不一样,那么同一个结构在不同系统中的大小就可能不一样。
csdn中有不少这样的问题,搜索一下。
csdn中有不少这样的问题,搜索一下。
|
结构的内存对齐是和编译器相关的,系统间传递结构是个复杂的事情,不是单用memcpy就可以解决的。
|
如果两边是相同的系统,那么可以直接传struct,但这种做法不推荐。在传struct的时候要注意字节序的转换,否则会导致结果不正确。
|
不同的系统间传递结构是很不明智的。不推荐使用。处理起来也很复杂。可以传字符串比如 XML格式的。
|
最好还是自己实现串行化,不要memcpy
|
yjf7888(断刀) ( ) 正解
但还是建议使用包结构如果跨平台就使用yjf7888(断刀) ( ) 的
但还是建议使用包结构如果跨平台就使用yjf7888(断刀) ( ) 的