Struct 结构转byte指针 的问题。

ponydph 2015-05-02 07:52:30
通讯程序,需要将设置的参数下发到下位机。
定义一个结构体
struct
{
BYTE a;
BYTE b;
BYTE c[2];
}PARAM;

PARAM pm;
pm.a=0x01;
pm.b=0x02;
pm.c[0]=0x03;
pm.c[1]=0x04;

现将改结构体转化为BYTE数组
BYTE arr[100];
int a=sizeof(PARAM);

for(int i-=0;i<a;i++)
{
arr[i]=(BYTE*) &pm[i];
}

//通过调试 发现
arr[0]=0xcd; 而不是0x01
arr[1] arr[2] arr[3] 都正确,请问是为什么??

由于结构体都是等长的变量,不存在对齐的问题。
为什么不是设定的0x01呢??


...全文
169 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2015-05-04
  • 打赏
  • 举报
回复
pragma pakc 控制结构体对齐字节

pragma pakc(push, 1)

struct
{
  BYTE a;
  BYTE b;
 BYTE  c[2];
}PARAM;

pragma pack(pop)

zwfgdlc 2015-05-04
  • 打赏
  • 举报
回复
	union PARAM
	{
		struct
		{
			BYTE	a;
			BYTE	b;
			BYTE	c[2];
		};
		BYTE bb[4];
	};
定义一个union就可以了
worldy 2015-05-03
  • 打赏
  • 举报
回复
引用 楼主 ponydph 的回复:
通讯程序,需要将设置的参数下发到下位机。 定义一个结构体 struct { BYTE a; BYTE b; BYTE c[2]; }PARAM; PARAM pm; pm.a=0x01; pm.b=0x02; pm.c[0]=0x03; pm.c[1]=0x04; 现将改结构体转化为BYTE数组 BYTE arr[100]; int a=sizeof(PARAM); for(int i-=0;i<a;i++) { arr[i]=(BYTE*) &pm[i]; } //通过调试 发现 arr[0]=0xcd; 而不是0x01 arr[1] arr[2] arr[3] 都正确,请问是为什么?? 由于结构体都是等长的变量,不存在对齐的问题。 为什么不是设定的0x01呢??
你这个拷贝还有一个很重要的问题要考虑,就是字节对齐,必须设置1字节边界对齐,否则拷贝结果不对
worldy 2015-05-03
  • 打赏
  • 举报
回复
实际上,最简单的方法是 memmove(arr,&pm,sizeof(pm)); 比最简单的方法还简单的方式是,不用拷贝 BYTE* pBuf=(BYTE*)±
worldy 2015-05-03
  • 打赏
  • 举报
回复
for(int i-=0;i<a;i++) 那你循环岂不是从-1开始了
笨笨仔 2015-05-03
  • 打赏
  • 举报
回复
检查内存中的结果正确,你可以试试。另外看看是否在读出数据时程序中有错?
笨笨仔 2015-05-03
  • 打赏
  • 举报
回复
测试程序:

	typedef struct
	{
		BYTE	a;
		BYTE	b;
		BYTE	c[2];
	}PARAM;

	PARAM   pm;
	pm.a=0x01;
	pm.b=0x02;
	pm.c[0]=0x03;
	pm.c[1]=0x04;

	BYTE  arr[100];
	int  a=sizeof(PARAM);

	for(int i=0;i<a;i++)
	{
		arr[i]=((BYTE*)&pm)[i];
	}
ponydph 2015-05-02
  • 打赏
  • 举报
回复
多谢 ,1代码中- 是打错了。 2)第二种方法 也测试过 ,也是同样的问题。
笨笨仔 2015-05-02
  • 打赏
  • 举报
回复
引用 楼主 ponydph 的回复:
通讯程序,需要将设置的参数下发到下位机。 定义一个结构体 struct { BYTE a; BYTE b; BYTE c[2]; }PARAM; PARAM pm; pm.a=0x01; pm.b=0x02; pm.c[0]=0x03; pm.c[1]=0x04; 现将改结构体转化为BYTE数组 BYTE arr[100]; int a=sizeof(PARAM); for(int i-=0;i<a;i++) { arr[i]=(BYTE*) &pm[i]; } //通过调试 发现 arr[0]=0xcd; 而不是0x01 arr[1] arr[2] arr[3] 都正确,请问是为什么?? 由于结构体都是等长的变量,不存在对齐的问题。 为什么不是设定的0x01呢??
1、循环代码: for(int i=0;i<a;i++) ,去掉i后的“-” 2、arr[i]=(BYTE*) &pm[i]; 改成 arr[i]=((BYTE*)&pm)[i]; 我运行测试结果正确

16,482

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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