2016-12-05 2 views
-1

は私がポインタを勉強し始め、私は次のコードといくつかのトラブルになった:基本ポインタの運動誤差

#include <stdio.h> 

int * g() 
{ 
    int a = 10; 
    return &a; 
} 

void main() 
{ 
    int *p; 
    p=g(); 
    printf("%d",*p); 
} 

それはエラーsegmentation fault. core dumped

私は本当に任意のヘルプをapreciateだろうが返されます。良い一日を!

答えて

3

ローカル変数のアドレスを返します。関数を終了すると、コードはこの変数をもう知りません。したがって、セグメンテーションフォルトが発生します。 この関数へのポインタをパラメータとして与えるか、この変数のメモリをヒープに動的に作成する必要があります。

void g(int* p) { 
    *p = 10; 
} 

int main() { 
    int a; 
    g(&a); 
    printf("%d", a); 
    return 0; 
} 

または

int* g() { 
    int* p = (int*) malloc(sizeof(int)); 
    *p = 10; 
    return p; 
} 

int main() { 
    int* p; 
    p = g(); 
    printf("%d", *p); 
    free(p) 
    return 0; 
} 
+1

うん。 OP、あなたは基本的に犯罪である死人の年金を取ることを望んでいました(「相対的なものであることは死であり、「セグメンテーションの誤り」はそのことに関する裁判官の意見です」)。 – Amadan

+0

'int * g()と書くこともできます。 { static int a = 10; リターン&a; } ' – Destructor