我在下面有这个代码,它通过网络获取一个131字节的缓冲区并将解码后的值存储到结构中的元素中,但对于第一个元素protocol_version
,我将值设置为缓冲区中的元素,但无法将protocol_version
的值设置为缓冲区中的第一个元素。结构如下:
typedef struct {
short protocol_version;
char username[64];
char verification_key[64];
char unused;
} player_identification;
代码在这里:
player_identification *parse_player_identification(char *buffer) {
player_identification *pkt = malloc(sizeof(player_identification));
pkt->protocol_version = buffer[0];
printf("0x0%x\n", pkt->protocol_version); // THIS PRINTS OUT 0x07 WHICH IS CORRECT!
char buf[64];
for(int i = 0; i < 64; i++) {
buf[i] = buffer[i + 1];
}
buf[64] = 0;
strcpy(pkt->username, trim_whitespace(&buf));
char buf2[64];
for(int i = 0; i < 64; i++) {
buf2[i] = buffer[i + 1 + 64];
}
buf2[64] = 0;
strcpy(pkt->verification_key, trim_whitespace(&buf2));
pkt->unused = buffer[130];
return pkt;
}
请注意我是如何将其打印出来的,它会打印0x07
的值,这是buffer[0]
始终为的常量值,但始终为0x00
。使用GDB,它表示指针为0x00
(null),因此我无法读取内存地址的内容。有什么想法吗?
答案 0 :(得分:1)
这两个:
buf[64] = 0;
....
buf2[64] = 0;
调用未定义的行为。这些缓冲区只有64
个元素。 C中大小为N
的本机数组可从0 ...(N-1)下标。这两个语句都写了一个元素,从那里开始,程序的剩余行为留给了仙女。