关于C结构的一些知识-我不了解

时间:2018-12-15 16:45:10

标签: c structure

我知道我们可以将一种结构分配给另一种结构,但是不能将一种结构的元素分配给另一种结构。

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

1 个答案:

答案 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.strstruct的副本,但是这里复制的不是数组,而只是指针。更改指向的字符串将在两个my_b中可见,因为它们通过指针共享同一数组。

如果您正在处理此类copy_my_b.str的副本,并通过指针修改了共享的字符串却没有意识到该字符串是共享的,那么这可能会使您绊倒,如代码中的最后一个示例:

my_b.str

程序输出:

struct