現在、C言語の学習をしています。
その中で、memcoyというメモリ領域をそのままコピーする関数が出てきました。
また、注意欄に
「memcopy関数などでコピーする行為は浅いコピーと言われ、配列や構造体は複製される一方、内部にもつポインタが指している領域まで複製されません。結果としてコピー元とコピー先で同一のものを指し、共有してしまいます。」
とありました。
意味がわからなかったので調べてみたところ、参考記事の中に、
「array1の値を変更すると、なぜかarray2の値も変更されます。これこそが、浅いコピーによる不可思議な現象です。」とありました。
しかし、以下のコードを実行したところ、片方の配列にしか影響が出ません。
C
1#include <stdio.h> 2#include <string.h> 3 4int main(void) 5{ 6 int a[4] = {19, 20, 29, 29}; 7 int b[4]; 8 int b2[4]; 9 memcpy(b, a, 16); 10 memcpy(b2, a, 16); 11 12 printf("配列aの2つ目の要素は%d、番地は%pです\n", a[1], &a[1]); 13 printf("配列bの2つ目の要素は%d、番地は%pです\n", b[1], &b[1]); 14 printf("\n"); 15 16//aの2つ目の要素を1に変更してみる 17 18 printf("配列aの2つ目の要素を1に変更する\n"); 19 a[1] = 1; 20 printf("配列aの2つ目の要素は%d、番地は%pです\n", a[1], &a[1]); 21 printf("配列bの2つ目の要素は%d、番地は%pです\n", b[1], &b[1]); 22 printf("\n"); 23}
「出力結果」
配列aの2つ目の要素は20、番地は0x7ffedfc58954です
配列bの2つ目の要素は20、番地は0x7ffedfc58944です
配列aの2つ目の要素を1に変更する
配列aの2つ目の要素は1、番地は0x7ffedfc58954です
配列bの2つ目の要素は20、番地は0x7ffedfc58944です
私は、浅いコピーはコピー元の要素を変えるとコピー先の要素も変わってしまうと解釈していたのですが、やはり解釈自体に問題があったのでしょうか?
アバウトな質問となってしまい申し訳ありません。

回答5件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/31 05:11
2020/02/03 00:32