2017-02-17 1 views
-2
#include<stdio.h> 

int * display(); 

main() 
{ 
    printf("\nHello\n"); 

    int * a = display(); 
    printf("%d", *a); 
} 

int * display() 
{ 
    printf("\n Hi \n"); 

    int b = 10; 
    return &b; 
} 

メモリ割り当てがどのように動作しますか?cでメモリ割り当てはどのように機能しますか?

私はこのプログラムのbの値にアクセスできると確信していますが、なぜそのアドレスにアクセスできないのですか?私はエラーが発生します(セグメンテーションフォルト)。

背後にあるコンセプトは何ですか?

私は初心者です。

+0

機能は、機能を出た後、生きていないだろうローカル変数へのポインタを返すためのプログラムは、未定義の動作をしています。 –

+0

これを読んでください:[ローカル変数へのポインタ](http://stackoverflow.com/questions/4570366/pointer-to-local-variable)。 – Lundin

+0

AFAIKこれは、この問題に関してSO上で最も多く閲覧されています。それは 'C++ 'とタグ付けされていますが、コンセプトは同じです。そして、それはEric Lippertから幾分実用的で楽しい類推があります:http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-アクセスされた範囲外/ 6445794#6445794 – yano

答えて

2

自動ローカル変数へのポインタを返さないでください。一度関数の戻り値がなくなると、定義されていない動作が呼び出されます。

あなたは動的にメモリを割り当てた後、ポインタを返すことができます。

int * display() 
    { 
     printf("\n Hi \n"); 

     int *b = malloc(sizeof(int)); 
     *b = 10; 
     return b; 
    } 
+4

あなた** **できます;彼のコードはどのように表示されます。あなたはしないでください。 「それをやめないでください」という二重項(または20個)があります。 –

+1

返すことができます、あなたは参照を解除することはできません。 @JonathanLeffler; –

+0

;それを修正しました。 – haccks

関連する問題