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);
}

var2.string は何もないため、期待される出力は最初の「var1: hello var2:」です。

2 番目のブロックは、var1 と var2 が同じであるため、「var1: hello var2: hello」である必要があります。

var1 と var2 は同じメモリ位置である必要があるため、3 番目のブロックは "var1: goodbye var2: goodbye" である必要があります。

ただし、3 番目のブロックで得られるのは、「var1: hello var2: goodbye」です。したがって、行var2 = var1は var2 のすべての属性を var1 の属性に自動的に設定するように見えます。これは、単純にメモリ内の場所に分解するのではなく、C が行うことですか?

4

2 に答える 2

4

var1 と var2 は同じメモリ位置である必要があるため、3 番目のブロックは "var1: goodbye var2: goodbye" である必要があります。

いいえ、異なるメモリ位置に存在しますvar1var2

ある構造体のインスタンスを別の構造体に割り当てると、ソース構造体が使用するメモリ領域が宛先構造体のメモリ領域にコピー (コピー) されます。この操作の後、それらはメモリ内の独立したオブジェクトのままであり、すべてのメンバーの値をあるメンバーから別のメンバーにコピーしただけです。

もちろん、一方をもう一方に再度コピーしない限り、1 つのオブジェクトに対する将来の変更は、もう一方のオブジェクトには影響しません。

于 2013-09-26T18:55:10.043 に答える
0

ここでは、実際の個別のメモリ位置を扱っています。var2 = var1,を代入すると、構造体のディープ コピーが行われ、代わりにポインターを扱っている場合のようなシャロー コピーは行われません。

于 2013-09-26T19:02:06.227 に答える