将struct指针转换为char *并复制

时间:2013-02-07 15:39:22

标签: c pointers

我有以下代码

struct Info { int age; char name[5]; }
char buffer[20];
Info i;
i.age = 10;
sprintf(i.name, "Case");
strncpy(buffer+5, (char*)&i, sizeof(Info));

现在我要恢复记录

Info j;
strncpy((char*)&j, buffer+5, sizeof(Info));
printf("%d %s", j.age, j.name);

然而,这会打印名称的空字符串。我不确定我做错了什么。

4 个答案:

答案 0 :(得分:6)

复制机制存在两个问题:

  1. 你假设sizeof(Info)是5.那绝对不是这样。
  2. 您正在使用strncpy,这是用于字符串的。 Info不是字符串,因此您需要使用memcpy
  3. 以下内容可行:

    char buffer[sizeof(i)];
    memcpy(buffer, &i, sizeof(i));
    
    ...
    
    memcpy(&j, buffer, sizeof(j));
    

    还有另一个问题; name[5]不足以容纳"Casey",因为一旦你考虑了 null终结符就会有6个字符。

答案 1 :(得分:4)

还有一些事情:

  • 您已经溢出缓冲区,char name[5]无法持有"Casey",终结者不合适。这会导致未定义的行为。
  • 您正在从&i进行复制,就好像这是指向字符串的指针一样,实际上它指的是第一个字段为struct的{​​{1}}。这无法可靠地工作。

答案 2 :(得分:0)

您发布的代码存在多个问题。首先,考虑到“Casey”必须为空终止,name的{​​{1}}字段太短。

您所做的观察是由于另一个问题。 info的地址不会与其j字段对齐。在那个地方仍然有一个name,很可能int age字段在4个字节后开始,但这是由编译器自行决定的。

至于恢复name,这是行不通的,因为它从未存储到缓冲区。

假设age足够大,buffer要存储,前两个参数切换为重建,可能有用。在这里使用memcpy(buffer, &i, sizeof(Info))会有所帮助,因为这样你就会问编译器结构sizeof在内存中布局这个结构的方式有多大。

答案 3 :(得分:0)

您不需要使用memcpy()来复制Info个变量。您只需使用赋值运算符:

Info j;
j = i;
printf("%d %s", j.age, j.name);

您可以这样做,因为Info不包含指针成员变量,因此在使用赋值运算符时您将获得深层复制。如果您只使用默认的复制构造函数,也会发生同样的情况:

Info j(i);

或:

Info j = i;

当然,正如其他人所指出的那样,你应该使Info::name足够大,以容纳你打算存储在其中的名称,包括'\0'字符串终止符。