结构体元素顺序与结构体大小

duanxj_buaa 2010-06-16 12:37:35
如果将一个结构体的元素顺序整体颠倒一下,结构体的大小会发生变化么?
...全文
189 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
struct abcd
{
char c;
int d;
int a ;
char b;
};


这样?
16

你要弄清楚字节对齐,就很好理解了
duanxj_buaa 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wind995 的回复:]
C/C++ code
#include <stdio.h>

struct abc
{
int a ;
char b;
char c;
int d;
};

struct abcd
{
int a ;
char b;
int d;
char c;

};

void main()
{
……
[/Quote]
首先在google上已经搜过了,没有确定的答复。只有关于改变元素顺序的讨论。
我的意思是将元素顺序整体颠倒,元素间的相对位置不变
  • 打赏
  • 举报
回复
#include <stdio.h>

struct abc
{
int a ;
char b;
char c;
int d;
};

struct abcd
{
int a ;
char b;
int d;
char c;

};

void main()
{
printf("%d\n", sizeof(abc)); //输出12
printf("%d\n", sizeof(abcd));//输出16

}
  • 打赏
  • 举报
回复
会的
存在字节对齐
newherer 2010-06-16
  • 打赏
  • 举报
回复
google 字节对齐
duanxj_buaa 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 wind995 的回复:]
引用 17 楼 duanxj_buaa 的回复:
传输时是将一个总的结构体通过内存拷贝到一个缓冲区中发送出去,接收时希望通过将结构体指针指向接收缓冲区来解析出来数据



C/C++ code
#include <iostream>

using namespace std;

struct send
{
char a;
int b;
short……
[/Quote]
大哥,你这是在同一个机器上,哪还有大小端之分了,不过还是谢谢大哥辛苦的回帖,结贴了
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 duanxj_buaa 的回复:]
传输时是将一个总的结构体通过内存拷贝到一个缓冲区中发送出去,接收时希望通过将结构体指针指向接收缓冲区来解析出来数据
[/Quote]

#include <iostream>

using namespace std;

struct send
{
char a;
int b;
short c;
char d;
short e ;
};

struct rev
{
char a;
int b;
short c;
char d;
short e ;
};

int main()
{
char Buff[20] ;
char Msg[20];
send s = {'a', 1234, 12, 'b', 34};
rev r;

memcpy(Buff, &s, sizeof(s));
memcpy(Msg, Buff, sizeof(s));
memcpy(&r, Msg, sizeof(r));

cout << r.a <<endl;
cout << r.b <<endl;
cout << r.c <<endl;
cout << r.d <<endl;
cout << r.e <<endl;

return 0;
}


可以
这是验证程序
好累
没问题的话结贴给分吧
duanxj_buaa 2010-06-16
  • 打赏
  • 举报
回复
传输时是将一个总的结构体通过内存拷贝到一个缓冲区中发送出去,接收时希望通过将结构体指针指向接收缓冲区来解析出来数据
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 duanxj_buaa 的回复:]
现在遇到一种情况,下位机为大端存储,上位机为小端存储,将下位机的结构体数据整体发给上位机,上位机中也定义同样的结构体将数据解析出来,上位机的结构体中元素顺序的定义是否应完全颠倒,才能解析出正确的数据呢?
[/Quote]

如果你是按格式传输的,那么对应就行了
  • 打赏
  • 举报
回复
struct abcd //16
{
char a;
int b;
short c;
char d;
short e
};


看看这个
duanxj_buaa 2010-06-16
  • 打赏
  • 举报
回复
现在遇到一种情况,下位机为大端存储,上位机为小端存储,将下位机的结构体数据整体发给上位机,上位机中也定义同样的结构体将数据解析出来,上位机的结构体中元素顺序的定义是否应完全颠倒,才能解析出正确的数据呢?
  • 打赏
  • 举报
回复
struct abcd
{
char a;
int b;
short c;
struct d; //空结构体,大小为1
};

struct dcba
{
struct d;//空结构体,大小为1
short c;
int b;
char a;
};


按最长的类型对齐,作为一格
同一变量不能同时跨2格
这里int = 4最长, 4为一格
char a; //b不能跨格,所以a独占一格
int b;//独占一格
short c;//占一个的2字节
struct d; //不跨格,占一个的1字节



liutengfeigo 2010-06-16
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
struct ab //4
{
int a;
};

struct abcd //16
{
char a;
int b;
short c;
ab d;
};

struct dcba //16
{
ab d;
short c;
int b;
char a;
};

struct abc //12
{
ab d;
int b;
short c;
char a;
};


还不明白我就没办法了
duanxj_buaa 2010-06-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wind995 的回复:]
引用 7 楼 duanxj_buaa 的回复:
struct abcd
{
char a;
int b;
short c;
struct d; //某个结构体
};

struct dcba
{
struct d;
short c;
int b;
char a;
};
这两个结构体是否大小一样


你这样当然是一样的
[/Quote]
还望能有详解
  • 打赏
  • 举报
回复
struct abcd
{
char a; //1
int b; //4
short c; //2
struct d; //1
struct dcba
{
struct d;//1
short c; //2
int b; //4
char a; //1
};
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 duanxj_buaa 的回复:]
struct abcd
{
char a;
int b;
short c;
struct d; //某个结构体
};

struct dcba
{
struct d;
short c;
int b;
char a;
};
这两个结构体是否大小一样
[/Quote]

你这样当然是一样的
duanxj_buaa 2010-06-16
  • 打赏
  • 举报
回复
struct abcd
{
char a;
int b;
short c;
struct d; //某个结构体
};

struct dcba
{
struct d;
short c;
int b;
char a;
};
这两个结构体是否大小一样
liutengfeigo 2010-06-16
  • 打赏
  • 举报
回复
还是可能会变。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧