[英]how to read memcpy struct result via a pointer
我想通过char* pc
复制内存中的结构内容并将其打印回来,但听说我有异常(读取违规)
struct af {
bool a;
uint8_t b;
uint16_t c;
};
int main() {
af t;
t.a = true;
t.b = 3;
t.c = 20;
char* pc = nullptr;
memcpy(&pc, &t, sizeof(t));
std::cout << "msg is " << pc << std::endl; // here the exception
return 0;
}
然后我想将数据从内存恢复到我所做的相同类型的另一个结构af* tt = (af*)(pc);
然后尝试访问tt->a
但总是异常
您需要先分配内存,然后才能将某些内容复制到其中。 另外, pc
已经是指针了,不需要再取它的地址了。 此外,字节表示很可能包含不可打印的字符。 要查看实际效果,请将以下从缓冲区复制回af
并打印其成员(请注意,需要进行std::cout
转换以防止std::cout
将uint8_t
解释为字符):
#include <iostream>
#include <cstring>
struct af {
bool a;
uint8_t b;
uint16_t c;
};
int main() {
af t;
t.a = true;
t.b = 3;
t.c = 20;
char pc[sizeof(af)];
std::memcpy(pc, &t, sizeof(t)); // array pc decays to pointer to first element
for (int i=0;i<sizeof(af); ++i){
std::cout << i << " " << pc[i] << "\n";
}
af t2;
std::memcpy(&t2, pc,sizeof(t));
std::cout << t2.a << " " << static_cast<unsigned>(t2.b) << " " << t2.c;
}
输出:
0
1
2
3
1 3 20
请注意,我用打印单个字符的循环替换了pc
的输出,因为二进制表示可能包含空终止符,而pc
不是空终止字符串。 如果你希望它是一个以空字符结尾的字符串,它的大小必须是sizeof(af) +1
并且有一个终止'\\0'
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.