我正在尝试将我的结构转换为char *,然后返回结构。但我想我错过了一些东西。一旦它返回到struct,结构的只有一个属性是正确的。其余的都错了。这是我的代码。
#include <iostream>
using namespace std;
struct INFO {
unsigned char a;
int b;
int c;
char g[121];
}inf;
int main () {
char frame[128];
INFO test1 = INFO();
test1.a='y';
test1.b=4000;
test1.c=9000;
strcpy(test1.g, "Goodbye World");
sprintf(frame,(char*)&test1);
INFO test2 = INFO();
memcpy((char*)&test2, frame, sizeof(frame)); //shouldn't test2 have test1 values?
cout << test2.a<<"\n";
cout << test2.b<<"\n";
cout << test2.c<<"\n";
cout << test2.g<<"\n";
getchar();
return 0;
}
输出:
y
-858993460
-858993460
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
只有test2.a是正确的。我将它转换为char *错误,还是我将其转换回来的方式?感谢
答案 0 :(得分:6)
此代码存在一些问题,但导致问题的是使用sprintf
将二进制数据从结构复制到字符数组:如果有的话结构数据中任何位置的NUL字节副本都将停止。在这种情况下,在第一个成员之后的struct数据中有一个NUL char,嵌入在第二个成员中或者因为填充,所以只有第一个成员被完全复制。
使用memcpy
代替sprintf
。
// sprintf(frame,(char*)&test1); <-- wrong
memcpy(frame, &test1, sizeof(frame));
INFO test2 = INFO();
memcpy(&test2, frame, sizeof(frame));
另一个问题是,由于填充和对齐,INFO结构的大小可能不是128,因此无法将其完全复制到frame
。使用sizeof
运算符查找大小。
答案 1 :(得分:3)
char frame[sizeof(INFO)]; // Let compiler decide size of frame
INFO test1 = INFO();
test1.a='y';
test1.b=4000;
test1.c=9000;
strcpy(test1.g, "Goodbye World");
memcpy(frame, &test1, sizeof(INFO)); // copy memory and not string