2017-11-07 19 views
0

ここでは何が起こっているのかはっきりとわかりません。同じボディに異なるパラメータを持つ2つの異なる関数が同じメモリ位置に値を返します

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int *f(int x){ 
    int p; 
    p=x; 
    return &p; 
} 

int *g(int x){ 
    int y; 
    y=x; 
    return &y; 
} 


int main(){ 
    int *x,*y; 
    x=f(1000); 
    y=g(250); 
    *x = *x + 250; 
    printf("%d\n",*y); 
    return 0; 

} 

出力: - 500

どのライン "* X = * X + 250" 変更 "* y" の値を来りますか?なぜ出力は250ではないのですか?

+3

ローカルポインタを返すことはできません – stackptr

+0

関数が終了するとスコープの外に出る_local_変数へのポインタを返しています。ここには何百もの重複があります。 –

+0

これは未定義の動作です。 – rsp

答えて

1
int *f(int x){ 
    int p; 
    p=x; 
    return &p; 
} 

この関数(およびg)では、ローカル変数のアドレスが返されます。呼び出し元がこのアドレスを使用すると、破壊された変数を参照しているので無効です(そのアドレスはfreeダイナミックメモリへのポインタのようです)。この結果、未定義の動作が発生します。

+0

ええ、私はそのエラーを持っていますが、残念ながら、これはオペレーティングシステムの試験紙のコードです。そこに彼らは出力を求めます。とにかく出力500を推測することはありますか? – piumi

+1

@piumiおそらく答えはちょうど:_スコープ外になったローカル変数へのポインタを使用するため、このプログラムの動作は未定義であるため、出力は予測できません。 [this](https://www.ideone.com/6Z3ust)を確認してください。 IMOこれはトリックの質問です。 –

+0

@piumi 'f'の' p'変数のメモリアドレスが 'f'関数が返ったときに上書きされず、' g'の 'y'変数が' p'と同じモーメリロケーションに割り当てられている場合'f'関数に割り当てられていて、' g'関数のメモリアドレスが 'g'変数のメモリアドレスに上書きされていなければ、結果は500になります。 –

関連する問題