问题描述
当我尝试使用 memcpy 函数将结构复制到字符数组缓冲区时,'\0' 被插入到字符数组中。我将缓冲区指针传递给一个函数。第一个 '\0' 之前的内容已经过去,但其余的都丢失了。我怎么解决这个问题?如果您能帮助我,我将不胜感激。
这里是代码,虽然结构体Mystruct和函数display()设计不合理。
#include <QCoreApplication>
#include <stdio.h>
struct MyStruct
{
char c;
int order;
char ch;
MyStruct(char c = 'b',int order = 0,char ch = 'a'):order(order),ch(ch),c(c)
{};
};
void display(char* str)
{
printf("%s",str);
}
int main(int argc,char *argv[])
{
QCoreApplication a(argc,argv);
MyStruct *mystruct = new MyStruct;
// char* test = new char[50];
char test[50];
memset(test,50);
memcpy(test,mystruct,sizeof(MyStruct));
display(test);
return a.exec();
}
我想通过套接字发送像“Mystruct”这样的结构,并且函数 send(char*) 需要一个指向缓冲区的 char* 指针。 '\0' 是在 int 顺序复制到 test[50] 中时插入到 char 数组中的。
我们使用 QT 的 QTcpsocket::write(char*) 而不是 Linux 或 Windows 提供的 API。我的队友给我提供了一个接口函数 send(char )。我需要传递 char 指针指向的缓冲区。
我用显示的代码简化了我的问题,并为我令人困惑的表达道歉。通过套接字发送结构的任何好方法?
解决方法
C 字符串函数适用于空终止字符串。
如果你想用 nul 非终端字符串处理 char*
,你需要大小(或其他哨兵)。
MyStruct mystruct;
std::string buffer {(char*) &mystruct,sizeof (MyStruct)};
请注意,这种序列化方式有很多陷阱:
- 填充(您可能会看到
c
和order
之间以及ch
之后的随机值(那些0
是随机的))。 - 字节序问题。
- ...