我有以下结构:
typedef struct{
int test;
std::string name;
} test_struct;
然后,我在main函数中有以下代码:
int main(int argc, char *argv[]){
test_struct tstruct;
tstruct.test = 1;
tstruct.name = "asdfasdf";
char *testout;
int len;
testout = new char[sizeof(test_struct)];
memcpy(testout, &tstruct, sizeof(test_struct) );
std::cout<< testout;
}
然而,没有任何东西被打印出来。怎么了?
答案 0 :(得分:1)
sizeof(std :: string)生成相同的值always。它不会给你字符串的运行时长度。要使用memcpy进行序列化,可以将结构更改为包含char arrray(例如char buffer[20]
),或者通过在结构上定义一个给出运行时字节长度的方法来计算所需序列化缓冲区的大小。
如果你想使用像std :: string这样的成员,你需要遍历struct的每个成员并序列化。
memcpy(testout, (void *)&tstruct.test, sizeof(int) );
memcpy(testout+sizeof(int), tstruct.name.c_str(),tstruct.name.length() );
针对整个结构的memcpy在这种情况下不起作用。
答案 1 :(得分:0)
尝试NULL - 终止字符串并发出换行符:
testout = new char[sizeof(test_struct) + 1];
memcpy(testout, &tstruct, sizeof(test_struct));
testout[sizeof(test_struct)] = '\0';
std::cout<< testout << std::endl;
但是,正如user3543576指出的那样,从这个过程中获得的序列化不会太有用,因为它将包含字符缓冲区的内存地址,而不是实际的字符串本身。