1
#include<stdio.h>
int* check(int,int);

int main()
{
    int *c,t = 2;
    c = check(10,20);
    printf("t = %d\n",t);
    printf("c = %d\n",*c);

    return 0;

}

int* check(int i,int j)
{
    int *p,*q;

    p = &i;
    q = &j;

    if(i>=45)
       return (p);
    else
       return (q);
}

私は次のようにコードの出力を取得しています:

t = 2
c = 2

なぜ?概念によれば、cに返される値はjアドレスです。つまり、* cの値は20ですが、cのprintfステートメントの前にprintfステートメントがあるため、*cの値はスタックとしてのガベージ値である必要があります。変更されます。

誰かがこれで私を助けることができますか?助けてください !!

4

3 に答える 3

3

ダングリングポインタの場合です。ダングリングポインタを参照Undefinedすることは、いつでもを与える可能性がありますunpredictable value

于 2012-08-19T11:08:54.963 に答える
1

これは非常に危険なコーディングです

int *p,*q;

    p = &i;
    q = &j;

iとjは両方ともスタック上にあり、チェックルーチンが終了するとすぐに、それらはメモリから削除されます。

右辺値ではなく左辺値を渡すことにより、他の方法でそれを行います(代わりにポインターが必要なため)

#include<stdio.h>
    int* check(int*,int*);

    int main()
    {
        int *c,t = 2;int dummy=30;
        c = check(&t,&dummy);
        printf("t = %d\n",t);
        printf("c = %d\n",*c);

        return 0;

    }

    int* check(int *i,int *j)
    {

        if(*i>=45)
           return (i);
        else
           return (j);
    }
于 2012-08-19T11:09:08.210 に答える
0

編集:私のgccでCが壊れる:)だからあなたはただ幸運だった。本番環境ではこれを行わないでください:)
実際、gcc -O3はスタック変更なしの動作を示し、gccはスタックを変更します。つまり、「未定義動作」です。

于 2012-08-19T11:07:09.623 に答える