我知道我们可以将一种结构分配给另一种结构,但是不能将一种结构的元素分配给另一种结构。
struct Date {
int sec;
int min;
int hour;
};
struct Date d1={1,2,3};
struct Date d2={10,20,4};
所以我知道这是有效的:
d1=d2;
但是不是(因为我们不能分配struct的元素)
d1.sec=d2.sec
但是现在我想知道,如果一个结构的元素是另一种结构,就像这样:
struct DateTime {
struct Date d;
struct Time t;
};
struct DateTime dt1;
struct DateTime dt2;
因此,如果我们这样做:
dt1=dt2;
我们是否将dt2的结构(日期和时间)分配给dt1的结构(日期和时间)?
现在(当一种结构的元素是另一种结构时)我们可以分配元素,如下所示:
dt1.d = dt2.d
答案 0 :(得分:2)
将struct
字段彼此分配是一种很好的习惯。您无法分配给数组,但是struct
对此提供了一种例外,因为将一个struct
分配给另一个数组会导致目标接收到第一个{{1} }。在下面的代码中,您无法分配struct
,因为它们是数组字段。您可以分配copy_my_a.str = my_a.str;
。
嵌套的copy_my_a = my_a;
以相同的方式复制,因此,如果分配了包含另一个struct
的{{1}},则整个struct
,包括嵌套的{{1} }。
如果struct
包含一个数组字段,则将该数组复制到目标struct
。由于这是一个副本,因此可以独立于原始数组进行更改。但是,如果struct
包含指向某些分配的指针(数组,动态分配等),则该指针将被复制,而不是分配的内容(即数组等)。这通常称为浅拷贝(尽管在C标准中不是该术语)。
分配struct
时,请务必谨慎;如果您通过一个struct
中的指针更改数组,则使用该指针在所有struct
中可见该更改。
在下面的示例中,structs
有一个数组字段,而struct
有一个struct
字段。 my_a
初始化为包含字符串(my_b
),char *
初始化为指向字符串第一个元素(my_a.str
)的指针。这两个"my_a"
中的每一个都通过分配进行复制。
在my_b.str
的副本中,"my_b"
是struct
的副本,因此整个数组已复制到新的my_a
。在此处更改原始字符串不会影响副本。同样,在copy_my_a.str
的副本中,my_a.str
是struct
的副本,但是这里复制的不是数组,而只是指针。更改指向的字符串将在两个my_b
中可见,因为它们通过指针共享同一数组。
如果您正在处理此类copy_my_b.str
的副本,并通过指针修改了共享的字符串却没有意识到该字符串是共享的,那么这可能会使您绊倒,如代码中的最后一个示例:
my_b.str
程序输出:
struct