结构元素的值在返回之前设置,但在返回时不设置

时间:2016-07-24 19:48:52

标签: c struct deserialization

我在下面有这个代码,它通过网络获取一个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),因此我无法读取内存地址的内容。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

这两个:

buf[64] = 0;
....
buf2[64] = 0;

调用未定义的行为。这些缓冲区只有64个元素。 C中大小为N的本机数组可从0 ...(N-1)下标。这两个语句都写了一个元素,从那里开始,程序的剩余行为留给了仙女。