C语言中的结构体嵌套

3
如果我有这些结构:
struct rec {
 int key;
 double value;
};

struct node {
 struct rec record;
 struct node *next;
};

我需要将一个名为struct rec *r的项的字段值复制到一个名为struct node *n的项中,我能做到吗?

n->record.key = r->key;
n->record.value = r->value;

直接的答案是否定的,但这只是因为你的成员被称为 record 而不是 rec。使用正确的成员名称,是的,你可以做到这一点,但有更好的方法(见下文)。 - WhozCraig
你说得对,现在我已经纠正了这段文本! - SegFault
3个回答

5

是的,你可以逐个字段地复制你的struct。你也可以一次性完成:

struct rec *r = ...;
struct node *n = ...;
n->record = *r; // Copies the content of "r" into n->record

那样做的好处是不必每次修改struct rec的结构时都要重新访问复制代码。

2

由于rec结构仅包含基本类型字段,因此进行以下操作是完全有效和合理的:

n->record = *r;

在这种情况下,相当于分别复制keyvalue字段:
n->record.key = r->key;
n->record.value = r->value;

1
什么是PDO类型?你是指POD吗?这是C语言而不是C ++。 - Jens Gustedt
@JensGustedt 一种后缀版本的POD =P - WhozCraig
@JensGustedt:是的,那是一个打字错误^^不过我已经编辑了我的回答,以避免进一步的混淆 :) - LihO
你对C++的POD隐式引用在C语言上下文中毫无意义。在这里,任何结构类型的赋值都是有效的操作。 - Jens Gustedt

-1
n->rec.key = r->key;
n->rec.value = r->value;

是正确的,但更好的是:

memcpy(&n->rec, r, sizeof n->rec);

现在,您可以通过不更改现有代码来扩展struct rec中的新字段。

3
-1,我不明白为什么memcpy比语言预设的复制操作更好?只需执行n->rec = *r即可。 - Jens Gustedt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接