gpt4 book ai didi

c - 从套接字 recv() 到 uint16_t 的 memcpy 上的段错误

转载 作者:行者123 更新时间:2023-11-30 15:30:07 54 4
gpt4 key购买 nike

我通过 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
}

我在这里做错了什么?

最佳答案

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

关于c - 从套接字 recv() 到 uint16_t 的 memcpy 上的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25789324/

54 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com