我有以下代码
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);
然而,这会打印名称的空字符串。我不确定我做错了什么。
答案 0 :(得分:6)
复制机制存在两个问题:
sizeof(Info)
是5.那绝对不是这样。strncpy
,这是用于字符串的。 Info
不是字符串,因此您需要使用memcpy
。以下内容可行:
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'
字符串终止符。