C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: 配列のコピーについて


(過去ログ 53 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■28927 / inTopicNo.1)  配列のコピーについて
  
□投稿者/ フミ (10回)-(2008/12/02(Tue) 19:22:35)

分類:[C#] 

配列のコピーに関して基本的な質問があります。

以下のプログラムのようにフィールドで宣言した配列abcに
メソッド内で宣言したローカルな配列defをイコールで結んでやると、
(abc = def のようにすると)
たぶん、defの参照がabcにコピーされると思うのですが、
メソッド終了時点でローカル配列defが消滅して、
結局abcの参照先がなくなってしまうのでしょうか???

実際に動かしてみると、値はしっかりと参照できてはいたのですが。。。
ただ偶然うまくいっただけでしょうか?


以下プログラム
    class aaa
    {
        int[] abc = new int[3] { 0, 1, 2 };

        private void xyz()
        {
            int[] def = new int[3] { 6, 7, 8 };

            abc = def;
        }
    }

引用返信 編集キー/
■28931 / inTopicNo.2)  Re[1]: 配列のコピーについて
□投稿者/ ま (174回)-(2008/12/02(Tue) 19:40:28)
No28927 (フミ さん) に返信
> たぶん、defの参照がabcにコピーされると思うのですが、
> メソッド終了時点でローカル配列defが消滅して、
> 結局abcの参照先がなくなってしまうのでしょうか???

aaaのインスタンス握っている間は大丈夫だよ。


引用返信 編集キー/
■28933 / inTopicNo.3)  Re[1]: 配列のコピーについて
□投稿者/ .SHO (275回)-(2008/12/02(Tue) 19:44:57)
No28927 (フミ さん) に返信

> 実際に動かしてみると、値はしっかりと参照できてはいたのですが。。。
> ただ偶然うまくいっただけでしょうか?

abcから参照されているので大丈夫だと思います。

引用返信 編集キー/
■28947 / inTopicNo.4)  Re[2]: 配列のコピーについて
□投稿者/ フミ (11回)-(2008/12/02(Tue) 21:53:36)
No28931 ま さん に返信
No28933 .SHO さん に返信

ご助言ありがとうございます!
大丈夫みたいで助かりました。
解決済み
引用返信 編集キー/
■28985 / inTopicNo.5)  Re[3]: 配列のコピーについて
□投稿者/ επιστημη (1412回)-(2008/12/03(Wed) 11:01:24)
επιστημη さんの Web サイト
2008/12/11(Thu) 00:34:07 編集(投稿者)
  int[] abc = new int[3] { 0, 1, 2 };
  private void xyz() {
    int[] def = new int[3] { 6, 7, 8 }; // [1]
    abc = def; // [2]
  } // [3]

[1] def が { 6, 7, 8 } を掴む。
[2] abc が (defが掴んでいる) { 6, 7, 8 } を掴む。
    このとき abc は掴んでいた { 0, 1, 2 } を手放す(ので廃棄対象となる)。
[3] メソッドを抜ける際に def がいなくなるので { 6, 7, 8 } を掴んでいた
    奴が二人(abc,def)から一人(abc)に減る。
  掴んでる奴が一人でもいる限り、捨てられることはない。
  なので { 6, 7, 8 } はabc が手放すまでは無問題。

解決済み
引用返信 編集キー/
■29543 / inTopicNo.6)  Re[4]: 配列のコピーについて
□投稿者/ フミ (13回)-(2008/12/10(Wed) 15:20:02)
No28985 (επιστημη さん) に返信

詳しい説明ありがとうございます!
誰かがつかんでいたのなら捨てられないのですね。
安心しました!
解決済み
引用返信 編集キー/
■29545 / inTopicNo.7)  Re[5]: 配列のコピーについて
□投稿者/ 倉田 有大 (390回)-(2008/12/10(Wed) 15:46:55)
2008/12/10(Wed) 15:50:35 編集(投稿者)
2008/12/10(Wed) 15:48:58 編集(投稿者)

No29543 (フミ さん) に返信
> ■No28985 (επιστημη さん) に返信
>
> 詳しい説明ありがとうございます!
> 誰かがつかんでいたのなら捨てられないのですね。
> 安心しました!

参照している限り大丈夫ですよ。
逆にC言語の場合どうだっけ。ローカルだから消える?
やべー、もうC言語組めないかも


引用返信 編集キー/
■29547 / inTopicNo.8)  Re[6]: 配列のコピーについて
□投稿者/ .SHO (365回)-(2008/12/10(Wed) 16:02:26)
No29545 (倉田 有大 さん) に返信

> 逆にC言語の場合どうだっけ。ローカルだから消える?
> やべー、もうC言語組めないかも

C言語の場合、そもそも「配列 = 配列」はできません。

引用返信 編集キー/
■29566 / inTopicNo.9)  Re[7]: 配列のコピーについて
□投稿者/ .SHO (368回)-(2008/12/10(Wed) 17:59:39)
ちなみにC言語の場合ですが

int *abc;

void sub() {
    int def[3] = { 1, 2, 3 };
    abc = def;
}

としたらdefは消えます。
よって、後でabcを使うと滅茶苦茶な値が入ってます。

引用返信 編集キー/
■29570 / inTopicNo.10)  Re[8]: 配列のコピーについて
□投稿者/ .SHO (371回)-(2008/12/10(Wed) 18:25:34)
「解決済み」付けておきます。
解決済み
引用返信 編集キー/
■29602 / inTopicNo.11)  Re[8]: 配列のコピーについて
□投稿者/ 倉田 有大 (394回)-(2008/12/11(Thu) 12:42:14)
No29566 (.SHO さん) に返信
> ちなみにC言語の場合ですが
>
> int *abc;
>
> void sub() {
> int def[3] = { 1, 2, 3 };
> abc = def;
> }
>
> としたらdefは消えます。
> よって、後でabcを使うと滅茶苦茶な値が入ってます。

どうもー
よかった、考え方はあってたというか、覚えていたみたい。
解決済み
引用返信 編集キー/
■29612 / inTopicNo.12)  Re[9]: 配列のコピーについて
□投稿者/ .SHO (378回)-(2008/12/11(Thu) 15:39:19)
No29602 (倉田 有大 さん) に返信

> どうもー
> よかった、考え方はあってたというか、覚えていたみたい。

はい。
C言語の場合、基本的にローカル変数は例外なく全てスタック上に
確保されるので、関数抜ければ全て使えなくなりますね。
ポインタで参照されていても、まったく関係無いです。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -