0

私は初心者です。何か奇妙なことを見つけたとき、私はポインターを操作していました。

#include<stdio.h>

int* fun(int*);

int main()
{
    int i=4,*j;
    j=fun(&i);
    printf("%d ",*j);//gives correct answer -> how??
    printf("%d",*j);//gives incorrect answer
}

int* fun(int *i)
{
    int k;
    k=*i;
    return (&k);
}

printf ( main(), I am using"%d ",*j);` で 2 回。最初のものは私に正しい答えを与えていますが、2番目のものはそうではありません。なんで?

しかし、これはうまく機能しています- #include int *func();

int main()
{
int *p;
p=func();
printf("%u", p);
printf("\n%d", *p);
printf("\n%d", *p);
printf("\n%d", *p);
printf("\n%d", *p);

}

int* func()
{
int i=10;
printf("%u", &i);
printf("\n%d", i);
return (&i);
}
4

2 に答える 2

8

ローカル変数へのポインターを返すことにより、未定義の動作を呼び出しています。関数funが戻ると、ローカル変数が占有していたスペースkは無効になります。実際には、以前に によって使用されていたスタック上の領域は、funおそらく への最初の呼び出しによって上書きされますprintf

于 2012-07-17T11:09:23.923 に答える
2

にローカルな変数のアドレスを返していますfunfun終了すると、その変数は存在しなくなり、ポインターは無効になります。厳密に言えば、動作は未定義です。

最も可能性が高いのは、k占有していたメモリ位置が への最初の呼び出しの後に上書きされることprintfです。

于 2012-07-17T11:12:51.577 に答える