-1
#include <iostream>
using namespace std;
int *wedgic(int foo)
{
    cout<<foo;
    return (&foo);
}

int main()
{
    int fo=7;
    int *blah;
    blah=wedgic(fo);
    (*blah)+=3;
    wedgic(fo);
}

結果が777であるのに、7 7 10ではない理由を誰かに教えてもらえますか?

助けてください、私はBlah = wedgic(fo);が何をしているのか理解していないと思います。行う...

ありがとう

4

2 に答える 2

2

まず、関数wedgicはローカル変数へのポインターを返しますfoowedgic関数終了直後はポインタが無効になります。返されたポインター値を使用しようとすると、未定義の動作が発生します。つまり、プログラムは意味のある結果を生成しません。動作は未定義です。そこに見えるもの(7 7 7または他のもの)は、意味のある説明のない単なる事故です.

第二に、あなたのプログラムは何かを出力しようと2 回しか試みません。それでもあなたは、それが何らかの形で3 つの数値を出力したと主張します。これは、動作が定義されていないプログラムであっても、ほとんどありません。出力に関するあなたの主張が間違っているか、偽のコードを投稿したかのいずれかです。あるコードによって生成された結果について質問する場合は、実際のコードを投稿してください。

于 2012-08-21T22:58:33.410 に答える
1

問題は、で宣言しwedgic()たアドレスではなく、独自のローカル変数へのポインターを返すことです。fomain()

変数fooinwedgic()は非静的ローカル変数です。つまり、その有効期間はこの関数の呼び出しを超えて延長されません。そのような変数へのポインターを返すことは、ポインターが関数の外で使用されるとすぐにそれが指すものが存在しなくなるため、まったく間違っています。

したがって

(*blah)+=3;

効果がなく、むしろ危険です。

于 2012-08-21T22:58:18.953 に答える