0

我正在使用一个简单的数据包序列化程序,我很难为我的数据包创建标头。我正在创建一个缓冲区,然后尝试将前两项加载到缓冲区中。我运行 memcopy 但缓冲区中实际上没有任何内容,然后当我尝试解压缩它时,我遇到了分段错误。在线阅读示例我认为我做对了。任何帮助,将不胜感激。

当打印出 uint 的值时,每个都有数据。

void createHeader(int messageLength, char* message) {
  uint16_t version = 457;
  uint16_t htonsVersion = htons(version);
  uint16_t length = messageLength;
  uint16_t htonsLength = htons(length);
  char buffer[142];
  printf("%" PRIu16 "\n", version);
  printf("%" PRIu16 "\n", htonsVersion);
  printf("%" PRIu16 "\n",htonsLength);
  printf("%" PRIu16 "\n",length);
  memcpy(buffer+0, &htonsVersion, sizeof htonsVersion);
  memcpy(buffer+2, &htonsLength, sizeof htonsLength);
  printf("%s \n", "UNPACK");
  uint16_t* testPacketVersion;
  memcpy(testPacketVersion, buffer+0, sizeof buffer+0);
  uint16_t* testPacketMessage;
  //Segmentation fault happens here
  memcpy(testPacketMessage, buffer+2, sizeof buffer+2);
  char* returnMessage;

}
4

1 回答 1

2

这个:

uint16_t* testPacketVersion;
memcpy(testPacketVersion, buffer+0, sizeof buffer+0);

是非常错误的。指针testPacketVersion未初始化,因此您将数据复制到内存中的随机位置。未定义的行为。

你甚至不应该有一个指针,因为你想创建一个实际的uint16_t,它应该是:

uint16_t testPacketVersion;
memcpy(&testPacketVersion, buffer+0, sizeof testPacketVersion);

我还更正了sizeof用法,因为那都是错误的。您想复制uint16_t.

于 2013-09-09T14:33:23.043 回答