memcpy 对包含 char 数组的结构失败
memcpy fails for struct that contains char array
struct Frame_t
{
uint16_t src_id;
uint16_t dst_id;
unsigned char num;
uint8_t is_seq;
char data[48];
};
typedef struct Frame_t Frame;
char *convert_frame_to_char(Frame *frame)
{
char *char_buffer = (char *)malloc(64);
memset(char_buffer,
0,
64);
memcpy(char_buffer,
frame,
64);
return char_buffer;
}
Frame *convert_char_to_frame(char *char_buf)
{
Frame *frame = (Frame *)malloc(sizeof(Frame));
memset(frame->data,
0,
sizeof(char) * sizeof(frame->data));
memcpy(frame,
char_buf,
sizeof(char) * sizeof(frame));
return frame;
}
那些效用函数被给出,如果我这样做
Frame *outgoing_frame = (Frame *)malloc(sizeof(Frame));
// outgoing_cmd->message contains "I love you"
strcpy(outgoing_frame->data, outgoing_cmd->message);
outgoing_frame->src_id = outgoing_cmd->src_id; // 0
outgoing_frame->dst_id = outgoing_cmd->dst_id; // 1
outgoing_frame->num = 100;
outgoing_frame->is_seq = 1;
//Convert the message to the outgoing_charbuf
char *outgoing_charbuf = convert_frame_to_char(outgoing_frame);
// Convert back
Frame *test = convert_char_to_frame(outgoing_charbuf);
// print test->data is "I "
test src为0,test dst为1,data为"I ",test num为d,test is_seq为1.
那么,为什么数据只有2个字符?
无损执行此操作的正确方法是什么?
谢谢!
memcpy(frame,
char_buf,
sizeof(char) * sizeof(frame));
应该是
memcpy(frame,
char_buf,
sizeof(Frame));
size(frame)
是指针的大小。因此,您只是从数组中复制 size of pointer
个字节。
这个:
memcpy(frame, char_buf, sizeof(char) * sizeof(frame));
没有意义,正如评论中指出的那样。乘以大小在这里是不合逻辑的。
因为 frame
是一个指针,我认为最好的做法是在指针指向的东西上使用 sizeof
,因为那是被复制(进入)的东西:
memcpy(frame, char_buf, sizeof *frame);
这也温和地 "locks" 复制到目标缓冲区大小的字节数,而不重复类型名称,这很好。
还要记住 sizeof
不是函数,只有当参数是类型名称时才需要括号,因为它们是参数的一部分(在这种情况下看起来像强制转换)。
struct Frame_t
{
uint16_t src_id;
uint16_t dst_id;
unsigned char num;
uint8_t is_seq;
char data[48];
};
typedef struct Frame_t Frame;
char *convert_frame_to_char(Frame *frame)
{
char *char_buffer = (char *)malloc(64);
memset(char_buffer,
0,
64);
memcpy(char_buffer,
frame,
64);
return char_buffer;
}
Frame *convert_char_to_frame(char *char_buf)
{
Frame *frame = (Frame *)malloc(sizeof(Frame));
memset(frame->data,
0,
sizeof(char) * sizeof(frame->data));
memcpy(frame,
char_buf,
sizeof(char) * sizeof(frame));
return frame;
}
那些效用函数被给出,如果我这样做
Frame *outgoing_frame = (Frame *)malloc(sizeof(Frame));
// outgoing_cmd->message contains "I love you"
strcpy(outgoing_frame->data, outgoing_cmd->message);
outgoing_frame->src_id = outgoing_cmd->src_id; // 0
outgoing_frame->dst_id = outgoing_cmd->dst_id; // 1
outgoing_frame->num = 100;
outgoing_frame->is_seq = 1;
//Convert the message to the outgoing_charbuf
char *outgoing_charbuf = convert_frame_to_char(outgoing_frame);
// Convert back
Frame *test = convert_char_to_frame(outgoing_charbuf);
// print test->data is "I "
test src为0,test dst为1,data为"I ",test num为d,test is_seq为1.
那么,为什么数据只有2个字符? 无损执行此操作的正确方法是什么?
谢谢!
memcpy(frame,
char_buf,
sizeof(char) * sizeof(frame));
应该是
memcpy(frame,
char_buf,
sizeof(Frame));
size(frame)
是指针的大小。因此,您只是从数组中复制 size of pointer
个字节。
这个:
memcpy(frame, char_buf, sizeof(char) * sizeof(frame));
没有意义,正如评论中指出的那样。乘以大小在这里是不合逻辑的。
因为 frame
是一个指针,我认为最好的做法是在指针指向的东西上使用 sizeof
,因为那是被复制(进入)的东西:
memcpy(frame, char_buf, sizeof *frame);
这也温和地 "locks" 复制到目标缓冲区大小的字节数,而不重复类型名称,这很好。
还要记住 sizeof
不是函数,只有当参数是类型名称时才需要括号,因为它们是参数的一部分(在这种情况下看起来像强制转换)。