2016-08-08 7 views
3

私の関数をコーディングして、参照へのポインタを適切に戻しています。 私は、機能がそれがやろうとしていたものを返すものの、std::coutが結果を修正していたことがわかりました。 ここで何か間違っていますか? この動作を修正するにはどうすればよいですか? objは、関数呼び出しの生活のためにのみ有効であるため、std :: cout変数値を変更する

次のコードスニペットを参照してください、

#include "stdafx.h" 
#include <iostream> 

using namespace std; 
class MyClass 
{ 
public: 
MyClass(int x_):m_Index(x_){} 
int m_Index; 
}; 

void myfunction(int *&currentIndex, MyClass obj) 
{ 
currentIndex = &obj.m_Index; 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    MyClass obj(5); 

    int *Index = NULL; 
    myfunction(Index, obj); 

    int curr_Index = *Index; 
    cout << "Index = " << curr_Index << std::endl; // This works fine. 
    cout << "Index = " << *Index << std::endl;  // This modifies *Index 
    return 0; 
} 
+0

何coutで印刷され、そしてあなたはそれが印刷し何をしたいですか? – naffarn

+0

"参照へのポインタを返す" - 'my関数は何も返しません。 int **へのポインタへの参照を**型とする引数をとります。 –

答えて

7
void myfunction(int *&currentIndex, MyClass obj) 
{ 
currentIndex = &obj.m_Index; 
} 

は未定義の動作を呼び出します。あなたはそれが範囲外になった後に使用するポインタ(またはそのメンバーの1つ)を保持します。

範囲外のものを指すことで解決できます(@ songyuanyaoの回答を参照)。この場合、ポインタが必要な理由は明確ではありません。 myfunctionは単にインデックスを返すことができます。

7

パラメータは値によって渡されるため、関数が終了すると破棄されるコピーが作成されます。 currentIndexが無効なアドレスを指すように設定されており、逆参照は未定義の動作です。うまくいくか、うまくいかない可能性があります。

一つの解決策は、objを参照することにより代わりの値によって渡されるようにすることです:

void myfunction(int *&currentIndex, MyClass& obj) 
{ 
    currentIndex = &obj.m_Index; 
} 
関連する問題