【问题标题】:Do structs automatically decompose to memory locations?结构会自动分解到内存位置吗?
【发布时间】:2013-09-26 18:50:30
【问题描述】:

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

【问题讨论】:

  • 您的第一个 printf("var2: %s\n", var2.string); 会导致未定义的行为,因为您尚未将 var2.string 初始化为任何内容。你很幸运,这不会导致程序崩溃。

标签: c struct deep-copy


【解决方案1】:

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

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

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

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

【讨论】:

  • 那么 C 将结构体视为原语吗?
  • @BillyHardy 我对规范知之甚少,无法确定它“完全相同”地对待它们,但它确实将它们视为值(而不是引用)。
  • 既然它会破坏内存区域,你可以对var1 ^= var2 和两个区域的位进行异或吗?
  • @BillyHardy 没有为结构定义 ^ 运算符。在 C++ 中,您可以重载它,但在这两种情况下,您都必须自己执行 xor 操作。
【解决方案2】:

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

【讨论】:

  • 它实际上介于深浅之间。例如,如果结构包含指针,则复制指针;指针的目标对象不会被复制到新的分配中。
猜你喜欢
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 2012-03-12
相关资源
最近更新 更多