[ad_1]
int *getNum() { int wholeNum; cout << "Enter a number: "; cin >> wholeNum; return &wholeNum; }
私が試したこと:
int getNum() { int wholeNum; cout << "Enter a number: "; cin >> wholeNum; return &wholeNum; }
解決策 1
問題は、戻り行で、wholenum の割り当てが解除され、これ以上存在しないことです。
したがって、返送先住所には不明な値が含まれています。
最も簡単な解決策は、int を直接返すことです
int getNum() { int wholeNum; cout << "Enter a number: "; cin >> wholeNum;return &wholeNum;return wholeNum; }
解決策 2
パトリスが正しく言ったことに追加するために、これは「ダングリング参照」と呼ばれ、メモリにはさまざまな「タイプ」があるために呼び出されます。
1) 関数の外部で変数を作成すると、コンパイル時に割り当てられるグローバル メモリ。
2) new または malloc / calloc を使用してコードの実行中に割り当てるヒープ メモリ
3) 関数を呼び出すときに動的に使用されるスタック メモリ。
関数を呼び出すと、その戻りアドレスがスタックにプッシュされ、関数が使用するすべての変数にもスタック上のスペースが割り当てられます。
関数が戻ると、変数のメモリが解放され、戻りアドレスがスタックからポップされ、そこからコードが続行されます。
別の関数を呼び出すと、同じことが起こり、同じスタック メモリ スペースが新しい関数情報で上書きされます。これが再帰を機能させる理由です。関数を再帰的に呼び出すたびに、スタック上で新しいスペースがその変数のために使用され、差出人住所。
しかし、スタックベースの変数のアドレスを返す場合、それは問題です。アドレスは有効ですが、次に関数を呼び出したときに内容が上書きされるためです! したがって、「ぶら下がっている参照」: それは本物であり、機能しますが、実際にはもう存在しません!
パトリスが言うように、それへのポインターではなく実際の数値を返します。つまり、値のコピーが返され、ダングリング参照はありません。
整数や浮動小数点数よりも「大きい」ものを返す必要がある場合は、ヒープにスペースを割り当ててそのポインターを返す必要がありますが、作業が完了したときにそのメモリを解放する責任があるため、事態が複雑になります。プログラムでメモリ リークが発生し、結果として最終的にクラッシュします。
[ad_2]
コメント