• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ポインタに関するトラブル)

ポインタに関連するトラブルの原因と解決方法

このQ&Aのポイント
  • ポインタに関連するトラブルの原因と解決方法を解説します。
  • 特定のポインタが異なる結果を返す問題についての対処方法を紹介します。
  • ポインタのアドレスが同じでありながら異なる結果が返される理由について説明します。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

> 自動変数のアドレスをもらって、直ぐにコピーしない 違います。 (*a).c[0] も「たまたま」値が上書きされなかっただけです。 アドレスが自動変数が使用する領域を指していること、そのアドレスにあったクラスは既に無効になっていること、には違いはありません。 現行のプロトタイプを使うなら、関数を抜けても消えないもの(グローバル変数や、newで確保した領域など)を返す必要があります。 どちらも、別の点で扱いに注意が必要です。 あるいは、呼び出し側をポインタではなく point a; と実体を用意して ・アドレス渡しや参照渡しを使う void 関数(point * ret,point 原点,double w,double d); void 関数(point & ret, point 原点,double w,double d); → point a ;  関数(&a, 原点,100.,100.); // point * ret,~  関数(a, 原点,100.,100.); // point &ret,~ ・実体を返す関数にする point 関数(point 原点,double w,double d); → point a = 関数(原点,100.,100.); ※ pointクラスが実際にはもっと複雑なら、コピーコンストラクタや =のオーバーライドが必要かも。 ・pointクラスのメッソドとして定義する class point { point & method(point 原点,double w,double d){ ~ return *this; //a.method(原点,100,100).c[0] みたいな使い方をしたいなら、自分自身の参照を返すようにする) } → point a ;  a.method(原点,100,100) ;

その他の回答 (5)

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.6

>自動変数のアドレスをもらって、直ぐにコピーしないと、 自動変数のアドレスを戻り値とすること自体が間違いです。

noname#164673
noname#164673
回答No.5

point型のポインタを返す関数()が返した結果を参照する時点で、実体が無くなっているとその様になる事があります。 point型のポインタを返す関数(){ point ans(0,0,0); return &ans; } ↑この様に関数を記述すると、関数の実行されている時点では、ansの値は正常ですが、リターンした後、スタックが上書きされるとansの値も上書きされます。 point型のポインタを返す関数(){ static point ans(0,0,0); return &ans; } とすれば、値は静的領域に残るので、いつまでもansは有効です。 とりあえず、思いついたので、参考にして下さい。

回答No.3

point* 関数(point 原点,double w,double d){ point p = {0,0,0}; // 自動変数の point* a = &p; // アドレスを return a; // 返してますよ! }

nasumiso2022
質問者

補足

なるほど・・・自動変数ってそういう意味なんですか・・・ いろいろ考えて分かりました。自動変数のアドレスをもらって、直ぐにコピーしないと、もともとそこにあったアドレスの指す変数は、スコープをでてしまっているから、上書きされちゃってたんですね・・・

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「自動変数のアドレスを返す」というボケをかましているとか?

nasumiso2022
質問者

補足

それはどういう意味なのでしょうか・・・ 説明不足だったので、補足にソースコードを付け足させて頂いたので、それを見てなにか分かることがあればよろしくお願いします。

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.1

具体的にどういうコードを書かれているのか書いた方がよいかと思います。 とりあえず現状いえることは書かれているコードのどこかがおかしい(あなたが思った動きをするコードにはなってない) くらいです。

nasumiso2022
質問者

補足

説明不足ですみません。 問題が再現されるギリギリまでソースコードを削ったものがこれです ////////////////////////////////////////////////////////// #include <iostream> #include <string> #include <stdio.h> using namespace std; class point{ public: double c[3]; }; point* 関数(point 原点,double w,double d){ point p = {0,0,0}; point* a = &p; return a; } int main(void){ point 原点; 原点.c[0] = 0; 原点.c[1] = 0; 原点.c[2] = 0; //////////////////////////////////////////////////////////// //左辺と右辺は同じはずなのに、表示すると違う結果に point *a = 関数(原点,100,100); //////////////////////////////////////////////////////////// printf("■アドレスの比較 \n"); printf("%p \n",a); printf("%p \n",関数(原点,100,100)); printf("■値の比較 \n"); printf("%f \n",(*a).c[0]); printf("%f \n",(*関数(原点,100,100)).c[0]); getchar(); return 0; } ///////////////////////////////////////////////////////////// これを実行すると、アドレスは同じなのに、値が違うという結果になります。

関連するQ&A

専門家に質問してみよう