変数のアドレスについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dig

変数のアドレスについて

#1

投稿記事 by dig » 13年前

はじめて質問させていただきます。よろしくお願いします。

C++のstaticやグローバル以外の変数のアドレスはプログラム実行中は不変なのでしょうか?

たとえば
img = &tempImage;

などとポインタにアドレスを渡すとします。このimgはプログラム終了まで常にtempImageを指すのでしょうか?
回答よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 変数のアドレスについて

#2

投稿記事 by softya(ソフト屋) » 13年前

正確に書くためにアドレスと呼ばずにポインタ値と呼ばさせてもらいます。

ローカル変数などの自動変数の寿命はスコープ範囲内ですので、それを過ぎた後はポインタ値が指していた変数は存在しない物と思って下さい。通常はその変数が占めていたメモリ空間は別の変数のために使われます。
たまたま、そのメモリ空間を使っていない可能性はありますが単なる偶然です。
スコープ内で変数の寿命が一度でも尽きない限りは変数のポインタ値が指す変数が存在することは保証されますが、スコープ外に出た場合ローカル変数が毎回同じポインタ値になる保証もありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dig

Re: 変数のアドレスについて

#3

投稿記事 by dig » 13年前

ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?

たとえば
img = &image.tempImage;

この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 変数のアドレスについて

#4

投稿記事 by softya(ソフト屋) » 13年前

dig さんが書きました:ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?

たとえば
img = &image.tempImage;

この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
クラスのインスタンスが生存しているのなら存在はしています。
ただ、クラスのメンバ変数のアドレスを公開するのはオブジェクト指向的にマズイのでは?と言う問題は置いておいての話です。
場合によっては避けれない場合もあるかも知れませんが極力避けるべき設計です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dig

Re: 変数のアドレスについて

#5

投稿記事 by dig » 13年前

softya(ソフト屋) さんが書きました:
dig さんが書きました:ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?

たとえば
img = &image.tempImage;

この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
クラスのインスタンスが生存しているのなら存在はしています。
ただ、クラスのメンバ変数のアドレスを公開するのはオブジェクト指向的にマズイのでは?と言う問題は置いておいての話です。
場合によっては避けれない場合もあるかも知れませんが極力避けるべき設計です。

理解できました。素早い返信ありがとうございました。

たかぎ
記事: 328
登録日時: 14年前
住所: 大阪
連絡を取る:

Re: 変数のアドレスについて

#6

投稿記事 by たかぎ » 13年前

dig さんが書きました:ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?

たとえば
img = &image.tempImage;

この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
一応補足しておくと...
上記の場合だと、imageの生存期間が終わる前であり、かつ単項の&演算子が多重定義されていなければ、同じアドレスを指すと考えて問題ありません。
単項の&演算子が多重定義されていた場合、それがどんな値を返すかは定義内容に依存しますので、これだけの情報では正確なことは何も言えません。

dig

Re: 変数のアドレスについて

#7

投稿記事 by dig » 13年前

たかぎ さんが書きました:
dig さんが書きました:ということはクラスのメンバとして保持されている変数の場合は、そのクラスが破棄されるまでそのメンバのポインタ値が指す変数が存在することは保証されるというわけでしょうか?

たとえば
img = &image.tempImage;

この場合imageクラスが破棄されるまでimgはimage.tempImageを参照できることが保証されるという理解でよろしいでしょうか?
一応補足しておくと...
上記の場合だと、imageの生存期間が終わる前であり、かつ単項の&演算子が多重定義されていなければ、同じアドレスを指すと考えて問題ありません。
単項の&演算子が多重定義されていた場合、それがどんな値を返すかは定義内容に依存しますので、これだけの情報では正確なことは何も言えません。

返信遅れてすいません。詳しい説明ありがとうございました。(なお、&演算子は多重定義されておりません。)

閉鎖

“C言語何でも質問掲示板” へ戻る