我通过C套接字发送uint8_t后跟uint16_t,但由于某种原因,当我尝试从char缓冲区复制数据时,我不断收到段错误。
// sending code:
uint8_t a_t = A;
uint16_t b = htons(B);
int len = sizeof(uint8_t) + sizeof(uint16_t); // should be 3 bytes
char buf[3];
memcpy(&buf, &cmd_t, sizeof cmd_t);
size_t offset = sizeof(uint8_t);
memcpy(&buf[offset], &cmd, sizeof cmd); // this works
send(sockfd, buf, len, 0);
// receiving code:
char buf[256];
int nbytes = recv(sockfd, buf, sizeof(buf), 0);
if (nbytes >0 ){
handleData(buf, nbytes); // buf = "\0\0-100/156"
}
void handleData(char *buf, int nbytes) {
// buf = "" ????
uint8_t a;
uint16_t b;
memcpy(&a, buf, sizeof(uint8_t));
memcpy(&b, buf[1], sizeof(uint16_t)); // <-- Segfaults here
int B = ntohs(b); // convert b to actual number
}
我在这里做错了什么?
答案 0 :(得分:1)
memcpy(&b, buf[1], sizeof(uint16_t)); // <-- Segfaults here
这是因为buf[1]
是char
,而memcpy
需要一个连贯的地址(从buf[1]
读取会给你带来垃圾)。
正如@joop在评论中所说,你应该宁愿:
memcpy(&b, buf+1, sizeof(uint16_t));
或:
memcpy(&b, &buf[1], sizeof(uint16_t));
在这里,您向memcpy
提供buf
的地址,其偏移量为1
。