结构会自动分解到内存位置吗?

时间:2013-09-26 18:50:31

标签: c struct deep-copy

C如何使用赋值运算符处理复制结构(不是指向结构的指针)。我在下面有一个示例程序,展示了我的问题。

struct s {
  char string[20];
};

void main() {
  struct s var1, var2;
  strcpy(var1.string, "hello");
  printf("var1: %s\n", var1.string);
  printf("var2: %s\n", var2.string);
  var2 = var1;
  printf("var1: %s\n", var1.string);
  printf("var2: %s\n\n", var2.string);
  strcpy(var2.string, "goodbye");
  printf("var1: %s\n", var1.string);
  printf("var2: %s\n", var2.string);
}

我期望的输出首先是“var1:hello var2:”,因为var2.string什么都没有。

第二个块应该是“var1:hello var2:hello”,因为var1和var2是相同的。

第三个块应该是“var1:goodbye var2:goodbye”,因为var1和var2应该是相同的内存位置。

我得到的第三个块是“var1:hello var2:goodbye”。所以看起来行var2 = var1会自动将var2的所有属性设置为var1的属性。这是C的作用而不是简单地将它们分解到内存中的位置吗?

2 个答案:

答案 0 :(得分:4)

  

第三个块应该是“var1:goodbye var2:goodbye”,因为var1和var2应该是相同的内存位置。

不,var1var2存在于不同的内存位置。

将一个结构的实例分配给另一个结构将源结构使用的内存区域blits(复制)到目标结构的内存区域。在此操作之后,它们仍然是内存中的独立对象,您只需将所有成员的值从一个复制到另一个。

对一个对象的未来更改不会影响另一个对象,除非您将其中一个再次复制到另一个对象上。

答案 1 :(得分:0)

在这里,您要处理实际的单独内存位置。当您指定var2 = var1时,这会构成deep copy结构而不是shallow copy,如果您正在处理指针,则会出现这种情况。