user-0 提问: c语言结构体强转后数据不对

回复:
user: user-1
content: 应该叫造型，这样才标准

user: user-2
content: 尽量应该传字符串，尽量避免传结构体

user: user-3
content: 结构体内存对齐问题 实战中不是会遇到这个问题吗？

user: user-4
content: 引用 10 楼 轻箬笠 的回复:前几天刚碰到类似的问题。 楼主把UINT8 *picData;换成UINT8 picData[0];试试 引用 11 楼 SanLenoTwo 的回复:picTmp.picData = pktBuff; 换成UINT8 picData[0]之后就无法进行赋值操作了。 楼主换个思维啊。 char buf[4096] = {0}; picturePkt *pkt = (picturePkt *)buf; memcpy((void *)picTmp.picData, (void *)pktBuff, len); send(buf);

user: user-5
content: typedef struct _PICTURE_PKT_TAG_ {     UINT8  isLastPkt;     //是否是最后一个包                            0     UINT8  pktLength;     //数据包长度  最大包长255字节       1     UINT32 curPktNum;     //当前包序号                                 2 3 4 5      UINT32 nextPktNum;    //下一个包序号                            6 7 8 9      UINT8 *picData;       //包数据                                           10 11 12 13 }picturePkt; //单字节对齐 UINT8  占1个字节 UINT32占四字节 UINT8 * picData 是个指针，这个指针地址，你给他赋值picTmp.picData = pktBuff;  你让他指向了pktBuff，你问别人为什么

user: user-6
content: UINT8 * 是一个指针类型，32位系统占用4个字节。 picData = pktBuff = 0x027fff6c; 强转成UINT8 之后变为四个字节，分别为 02 7f ff 6c

user: user-7
content: #include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("AD sizeof %d\n", sizeof(AD));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("A1 sizeof %d\n", sizeof(A1));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("A2 sizeof %d\n", sizeof(A2));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("A4 sizeof %d\n", sizeof(A4));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("A8 sizeof %d\n", sizeof(A8));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("A16 sizeof %d\n", sizeof(A16));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 //AD sizeof 32 // //A1.a 0 //A1.b 4 //A1.c 17 //A1 sizeof 25 // //A2.a 0 //A2.b 4 //A2.c 18 //A2 sizeof 26 // //A4.a 0 //A4.b 4 //A4.c 20 //A4 sizeof 28 // //A8.a 0 //A8.b 4 //A8.c 24 //A8 sizeof 32 // //A16.a 0 //A16.b 4 //A16.c 24 //A16 sizeof 32 // //

user: user-8
content: 引用 2 楼 SanLenoTwo 的回复:谢谢，大小端是决定了数据的存放位置。我想知道 i=10  buf=6c i=11  buf=ff i=12  buf=7f i=13  buf=2 这几个数据是怎么来的。  你看一下 i=8  buf=0 i=9  buf=0  i=10  buf=6c i=11  buf=ff 这几个值合起来是：nextPktNum， i=12  buf=7f i=13  buf=2  i=14  buf=ff i=15  buf=d8 这几个合起来是：picData

user: user-9
content: 百度搜索 内存对齐 现在上课不教这个吗?

user: user-0
content: 谢谢，大小端是决定了数据的存放位置。我想知道 i=10  buf=6c i=11  buf=ff i=12  buf=7f i=13  buf=2 这几个数据是怎么来的。

user: user-8
content: 注意你的系统是小端系统还是大端系统，一般我们用的都是小端系统，小端系统遵循高对高，低对低，即高地址存放高字节， 低地址存放低字节。  大端系统正好相反，“高对地，低对高”

user: user-5
content: 引用 9 楼 SanLenoTwo 的回复:因为要将picTmp数据发送出去，所以必须一个字节一个字节的取出来。picTmp.picData = pktBuff;本身没错，因为直接picTmp.picData[0]这种方式得到的数据是对的，强转之后数据就不对了。我的理解是数组的地址赋给了picTmp.picData强转之后直接访问就可以了，但是看来首先得到的是指针地址占据的四个字节。 你要发送消息就直接定义无属性的空间，把你要发送的按字节填充进去，你怎么强转都是没有用的。你想直接发结构，需要把结构序列化

user: user-0
content: picTmp.picData = pktBuff; 换成UINT8 picData[0]之后就无法进行赋值操作了。

user: user-4
content: 前几天刚碰到类似的问题。 楼主把UINT8 *picData;换成UINT8 picData[0];试试

user: user-0
content: 因为要将picTmp数据发送出去，所以必须一个字节一个字节的取出来。picTmp.picData = pktBuff;本身没错，因为直接picTmp.picData[0]这种方式得到的数据是对的，强转之后数据就不对了。我的理解是数组的地址赋给了picTmp.picData强转之后直接访问就可以了，但是看来首先得到的是指针地址占据的四个字节。

user: user-5
content: 引用 楼主 SanLenoTwo 的回复:在工作中遇到如下问题，望各位大侠解答一下不胜感激。 typedef struct _PICTURE_PKT_TAG_ {     UINT8  isLastPkt;     //是否是最后一个包     UINT8  pktLength;     //数据包长度  最大包长255字节     UINT32 curPktNum;     //当前包序号     UINT32 nextPktNum;    //下一个包序号     UINT8 *picData;       //包数据 }picturePkt; //单字节对齐  代码段：     picturePkt picTmp;      picTmp.isLastPkt = isLastPkt;     picTmp.pktLength = ret;     picTmp.curPktNum = curPktNum;     picTmp.nextPktNum = nextPktNum;     picTmp.picData = pktBuff;     UINT8 *picBuff = (UINT8 *)&picTmp;     //强转之后的数据有问题 i=0  buf=0 i=1  buf=36 i=2  buf=0 i=3  buf=0 i=4  buf=0 i=5  buf=0 i=6  buf=1 i=7  buf=0 i=8  buf=0 i=9  buf=0  i=10  buf=6c i=11  buf=ff i=12  buf=7f i=13  buf=2  i=14  buf=ff i=15  buf=d8 i=16  buf=ff i=17  buf=e0  请问i=10 buf=6c ------ i=13 buf=2这段数据是怎么来的，我看了一下这四个数据组合之后的值27fff6c是pktBuff的地址，应该如何去理解。 你后面的指定应该这样定义的 picturePkt* picBuff = &picTmp; 完全没必要强转成指向UINT8 类型的指针