Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构是否自动分解到内存位置?_C_Struct_Deep Copy - Fatal编程技术网

C 结构是否自动分解到内存位置?

C 结构是否自动分解到内存位置?,c,struct,deep-copy,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("v

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:hellovar2:”,因为var2.string什么都不是

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

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

不过,我在第三个街区看到的是“var1:你好var2:再见”。因此,行
var2=var1
自动将var2的所有属性设置为var1的属性。这就是C所做的,而不是简单地将它们分解到内存中的位置吗

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

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

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

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

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

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

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


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

这里您要处理的是实际的单独内存位置。当您分配
var2=var1
时,这会对结构产生影响,而不是处理指针时的情况。

这里处理的是实际的独立内存位置。当您分配
var2=var1
时,这会对结构产生影响,而不是像处理指针那样。

您的第一个
printf(“var2:%s\n”,var2.string)导致未定义的行为,因为您尚未将
var2.string
初始化为任何内容。幸运的是,这不会导致程序崩溃。您的第一个
printf(“var2:%s\n”,var2.string)导致未定义的行为,因为您尚未将
var2.string
初始化为任何内容。幸运的是,这不会导致程序崩溃。它实际上介于深度和深度之间。例如,如果结构包含指针,则复制指针;指针的目标对象并没有被复制到新的分配中。它实际上介于深度和浅层之间。例如,如果结构包含指针,则复制指针;指针的目标对象没有复制到新的分配中。那么C是否将结构视为基本体?@BillyHardy我对规范了解不够,无法确定它是否将它们视为“完全相同”,但它确实将它们视为值(与引用相反)。因为它会屏蔽内存区域,您能对两个区域的位执行异或操作吗?@BillyHardy未为结构定义
^
运算符。在C++中,你可以超载它,但是在这两种情况下,你都必须自己做XOR操作。C是否也和原语一样对待结构?@比利亚哈迪,我不太了解这个规范,肯定地说它对待它们“完全一样”,但是它把它们当作值(而不是引用)。您能对两个区域的位执行异或操作吗?@BillyHardy未为结构定义
^
运算符。在C++中,你可以超载它,但是在这两种情况下,你都必须自己做XOR操作。