求问一个强制转换类型的问题。

2019-10-15 00:28发布

本帖最后由 vention 于 2017-2-23 11:48 编辑

我定义了一个结构体,总共应该是19个Byte,我再定义一个 20Byte 的 buf数组。
将类开辟空间赋值完后, 强制转换为 unsigned char 后,放进数组buf。
复完值后,我拷贝进去  ac_buf这个数值。  却发现在Frame_CRC 和 Frame_Cmd 之前多了一个Byte,请问是怎么回事。
buf 的0 ~17 个Byte 与 结构体的 前 18个Byte一样。 后面的数值也一样,就是拷贝过去的时候为何中间多了一个Byte?
对比如截图。

unsigned char ac_buf[20]={0};
typedef struct
{
        unsigned char        Frame_FCS;                 
        union_Func_type      Frame_Func;                 
        unsigned short int   Frame_Rvd;         
        unsigned long int    Frame_CID[3];   
        unsigned char        Frame_Cmd;                 
        unsigned short int   Frame_CRC;                 
}Send_Command_Frame_type;    //1Byte + 1Byte + 2Byte + 3*4Byte + 1Byte + 2Byte = 19Byte

Send_Command_Frame_type     *pSend_Command_Frame;

memcpy(ac_buf,pSend_Command_Frame,20);

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
msq001
1楼-- · 2019-10-15 21:34
在缺省对齐下的三条准则
【1】结构体变量的首地址能够被其最宽基本类型成员的大小所整除
【2】结构体每个成员相对于结构体首地址的偏移量是成员大小的整数背
【3】结构体的总大小为结构体最宽基本类型成员大小的整数背
vention
2楼-- · 2019-10-15 22:26
 精彩回答 2  元偷偷看……
漂泊的雨林
3楼-- · 2019-10-15 23:58
vention 发表于 2017-2-22 17:59
如何计算出结构体本身就是20个字节?? 我就是很奇怪这一点

printf("%d",sizeof(结构体))
TGuest
4楼-- · 2019-10-16 05:56
楼主,你这有几个问题,首先,这个不叫类,只有在面向对象语言中才会出现类,在C语言这种面向过程的语言中,楼主定义的是结构。虽然感觉没什么,但是会被贻笑大方。第二,楼主结构体定义的有问题,正如大家说的,结构体的定义要按照结构体内容的大小来定义,最好是从小到大,例如:结构体name{unsigned char, unsigned short int ,unsigned int,unsigned long int};这样他的大小是1+2+4+4,如果定义为{unsigned short int ,unsigned char}结构体大小不是2+1,而是2+2。系统会自动将数据空间对齐。第三,楼主在强转的时候最好不要以大空间转小空间,例如你一个unsiged short int 0x0403强转为unsigned char。那转换出来的结果为0x03,而高位的04就会丢失,会造成程序出错。
vention
5楼-- · 2019-10-16 11:55
本帖最后由 vention 于 2017-2-23 11:55 编辑
TGuest 发表于 2017-2-23 11:09
楼主,你这有几个问题,首先,这个不叫类,只有在面向对象语言中才会出现类,在C语言这种面向过程的语言中 ...

谢谢指出。 问题一,确实是我弄错概念名称,在面向对象中才有类的概念。 问题二和三不正确。 在打包数据的时候,没可能将就着从大到小来排列结构体里面的内容。在定义结构体的时候需要用#pragma pack 做对齐就可以,用完再恢复就行了。
TGuest
6楼-- · 2019-10-16 14:22
vention 发表于 2017-2-23 11:54
谢谢指出。 问题一,确实是我弄错概念名称,在面向对象中才有类的概念。 问题二和三不正确。 在打包数据 ...

所以我说是最好,如果不按照也是可以的,只要知道该怎么算。

一周热门 更多>