我正在使用一个简单的数据包序列化程序,我很难为我的数据包创建标头。我正在创建一个缓冲区,然后尝试将前两个项加载到缓冲区中。我运行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;
}
答案 0 :(得分: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
所需的任意数量的字符。