在c中构造的类型转换数组

use*_*571 6 c structure

我有这样的结构

struct packet
{
int seqnum;
char type[1];
float time1;
float pri;
float time2;
unsigned char data[512];
}
Run Code Online (Sandbox Code Playgroud)

我在数组中收到数据包

char buf[529];
Run Code Online (Sandbox Code Playgroud)

我想取seqnum,数据一切都是单独的.下面的类型转换工作..它给我的垃圾值.

struct packet *pkt;
pkt=(struct packet *)buf;
printf(" %d",pkt->seqnum)
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 8

不,这可能不会起作用,并且通常是一种糟糕而破碎的方式.

您必须使用特定于编译器的扩展来确保结构成员之间没有不可见的填充,以实现类似的工作.例如,使用gcc,您可以使用__attribute__()语法执行此操作.

因此,它不是一个便携式的想法.

明确它,并打开每个字段是更好的.这也为您提供了在网络协议中具有明确定义的字节顺序的机会,这通常是互操作性的好主意.


Ker*_* SB 5

不,这通常不是有效的代码.您应首先创建结构,然后将内容存储到其中:

packet p;

memcpy(&p.seqnum, buf + 0, 4);

memcpy(&p.type[0], buf + 4, 1);

memcpy(&p.time1, buf + 5, 4);
Run Code Online (Sandbox Code Playgroud)

等等.

您必须非常小心地确定类型大小和字节顺序.