6

我正在尝试将我的结构转换为 char*,然后再转换回结构。但我想我错过了一些东西。一旦返回给struct,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* 是错误的,还是我将其转换回来的方式?谢谢

4

2 回答 2

7

这段代码有一些问题,但导致问题的原因是使用将二进制sprintf数据从结构复制到字符数组:如果结构数据中的任何地方都有 NUL 字节,则复制将停止。在这种情况下,在第一个成员之后的结构数据中有一个 NUL 字符,要么嵌入到第二个成员中,要么因为填充,所以只有第一个成员被完全复制。

使用memcpy而不是sprintf.

// sprintf(frame,(char*)&test1); <-- wrong
memcpy(frame, &test1, sizeof(frame));

INFO test2 = INFO();
memcpy(&test2, frame, sizeof(frame));

另一个问题是 INFO 结构的大小可能不是 128 因为填充和对齐,所以它不能完全复制到frame. 使用sizeof运算符查找大小。

于 2013-10-05T19:07:52.740 回答
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
于 2013-10-05T19:25:11.787 回答