3

我有以下代码

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

4 回答 4

6

您的复制机制存在两个问题:

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

以下将起作用:

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

...

memcpy(&j, buffer, sizeof(j));

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

于 2013-02-07T15:42:13.227 回答
4

有几件事:

  • 你溢出了缓冲区,char name[5]不能保持"Casey",终结器不适合。这会导致未定义的行为。
  • 您正在复制 from &i,就好像那是指向字符串的指针,而实际上它指向 a struct,其第一个字段是 a int。这不会可靠地工作。
于 2013-02-07T15:43:07.400 回答
0

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

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

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

可行的是,假设它buffer足够大,memcpy(buffer, &i, sizeof(Info))可以存储,并且前两个参数切换到重构。在这里使用sizeof会有所帮助,因为这种方式是在询问编译器Info该结构在内存中的布局方式有多大。

于 2013-02-07T15:51:18.797 回答
0

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

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

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

Info j(i);

或者:

Info j = i;

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

于 2013-02-07T15:59:04.520 回答