2

私の関数プロトタイプはこれです。

int * f4(int parm);

私の関数は次のようになります

int * f4(int parm)
{
    return &parm + 1;  
}

私の戻り値の型はこれに対して正しいですか? 関数を呼び出しても何もしないからです。

これは私の電話です

int *pointer1;
pointer1 = f4(319);
cout << pointer1 << endl;

ポインターのアドレスを返しますが、値を返す必要がありますが、動作させることができないようです。

使用して

cout << *pointer << endl;

0を表示するだけです

4

2 に答える 2

6

問題は、オブジェクトparmがその関数に対してローカルであることです。関数の呼び出しが終了した後、それへのポインターを取得して保持する (つまり、返す) ことは正しくありません。

つまり、parm機能が存在する間は「生きている」。関数がすべてのローカル オブジェクト ( などparm) を返すときは、「死ぬ」。

crushコメントにあるようにpointer1、無効なポインターになり、愛情を込めて「ぶら下がっている」ポインターとも呼ばれます。

正しい方法を教えてください!!

要求に応じて、これを「正しく」実行する方法がいくつかあります。

  • parm + 1直接戻り、関数の戻り値の型を変更します。本当にポインターが必要なようには聞こえません

  • パラメーターをポインター (または参照、これは C++ です) として受け取り、そのポイントされた値をインクリメントします。必要に応じて返すこともできます-関数の外から来るので、返すことは有効です

  • staticstatic int sparm; sparm = parm + 1を追加し、へのポインターを返しますsparm。これにより、関数が再入不可になりますstaticが、機能します。関数呼び出しが終了してもオブジェクトは死にません

  • ポインターにメモリを割り当てて (ああ! やめて!)、それを返します。


コードを注意深く読むと、ポインターが決して有効ではないことは明らかです。最初から、として利用可能なメモリを超えて 1 スロットですparm

于 2013-09-11T20:52:36.663 に答える
3

ローカル変数へのポインターを返すことは悪いニュースです。 parmは関数パラメータであり、 に対してローカルf4です。呼び出し元に不適切なポインターを返し、それを逆参照しようとしています。それは涙で終わるだけです。

于 2013-09-11T20:52:30.680 に答える