所以我正在阅读关于Beej指南的一些内容,我正在使用pack函数将数据序列化到一个缓冲区,一切都很好,直到我得到以下内容我开始遇到这种行为。
int packetsize = pack(buf, "HH",cinfo->id,cinfo->port);
int16_t client_id;
int16_t portnumber;
unpack(buf, "HH", &client_id,&portnumber);
printf("LOGIN with id: %" PRId16 "=%d portnumber:%d \n", client_id, cinfo->id, portnumber);
提供此输出
LOGIN with id: 0=1 portnumber:1151
但如果我稍微改变它
int16_t portnumber, client_id;
unpack(buf, "HH", &client_id,&portnumber);
printf("LOGIN with id: %" PRId16 "=%d portnumber:%d \n", client_id, cinfo->id, portnumber);
输出更改
LOGIN with id: 1=1 portnumber:1150
你知道这可能会发生在这里吗?
编辑1:
HH和hh都会发生这种情况,它可能是@Artemy建议的内存溢出但我不确定为什么会发生这种情况,因为它们的大小都相同,并且缓冲区足够大。虽然不确定原因,但声明的顺序似乎很重要。
这有效
int16_t portnumber, client_id;
这不起作用。
int16_t client_id, portnumber;
编辑2,这是我正在使用的结构
typedef struct ClientInfo {
char name[HOSTNAME_LEN], *ip_address;
int16_t message_sent, message_received, status, socket, id, port;
LIST_ENTRY(ClientInfo) clients;
} ClientInfo;