0

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 所做的,而不是简单地将它们分解到内存中的位置吗?

4

2 回答 2

4

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

不,var1并且var2存在于不同的内存位置。

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

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

于 2013-09-26T18:55:10.043 回答
0

在这里,您正在处理实际的单独内存位置。当您分配var2 = var1, 时,它会执行结构的深层副本,而不是像您处理指针时那样的浅层副本。

于 2013-09-26T19:02:06.227 回答