我需要用C代码创建二进制数据包。但是,我遗漏了一些基本观点。目前,已经定义了结构,我将需要使用它们(至少用于读取数据包数据)。相同的结构将用于接收的数据包和发送的数据包。这是数据包结构:
typedef struct {
uint8_t packetType;
uint16_t packetBody;
} MyStruct;
和另一个结构:
typedef union {
const uint8_t *bytes;
MyStruct *packet;
} MyPacket;
这里的函数应该是一个指向struct的指针,用数据填充它并返回:
void packetWithBytes(MyPacket *packet)
{
packet->packet->packetType = 1; // crashed with EXC_BAD_ACCESS
packet->packet->packetBody = 3;
}
这是对我的函数的调用,它应返回指向二进制数据的指针:
MyPacket *packetRef;
packetWithBytes(packetRef);
NSData *data = [NSData dataWithBytes:packetRef->bytes length:sizeof(packetRef->bytes)];
我觉得我应该在某处(malloc
)分配一些空间,但不知道在哪里以及如何做到这一点。调用部分代码不应该知道有关数据包大小的任何细节。试图做分配,但得到同样的错误:
void packetWithBytes(MyPacket *packet)
{
packet->bytes = malloc(sizeof(uint8_t) + sizeof(uint16_t)); //crash
packet->packet->packetType = 1;
packet->packet->packetBody = 3;
}
尝试从const
成员字节中删除MyStruct
,但收到相同的错误。我对C不是很熟悉,所以非常感谢帮助。
答案 0 :(得分:4)
MyPacket *packetRef;
packetWithBytes(packetRef);
是问题所在。 packetRef
是一个未初始化的指针,它可能指向无效的内存位置 - 取消引用它是未定义的行为。您可以通过两种方式解决此问题:
MyPacket *packetRef = malloc(sizeof(*packetRef));
packetWithBytes(packetRef);
或
MyPacket packetRef;
packetWithBytes(&packetRef);