2016-09-23 2 views
3
#include<stdio.h> 

void f(int *p) { 
    static int data = 5; 
    p=&data; 
} 

int main(void) { 
    int *ip=NULL; 
    f(ip); 
    printf("%d\n", *ip); 
    return 0; 
} 

可能であれば、 原因エラーは何ですか? コードを修正するにはどうすればよいですか?は可能ですか?ローカル静的値のアドレスをメインポインタに渡す?

+1

'p'は' ip'のコピーです。 'p'を変更すると' ip'は変更されません。 – mch

+3

は明らかですが、そうでなければ、 'f'からの' void'の返り値は、最初にパラメータを使うのではなく、アドレスを返すのが良いでしょうか? – WhozCraig

+0

これは既に何度も尋ねられていますが、これに対する標準的な答えは素晴らしいでしょう。 –

答えて

3

ローカルポインタの値を変更してしまうこの方法では、あなたがmainからポインタ(&)へのポインタを渡し、関数内間接参照演算子(*)を使用する必要があります。

#include <stdio.h> 

void f(int **p) { 
    static int data = 5; 

    *p = &data; 
} 

int main(void) { 
    int *ip = NULL; 

    f(&ip); 
    printf("%d\n", *ip); 
    return 0; 
} 

しかし、通常、我々は機能からアドレスを返す間接の同じレベルで動作することを好む、これは(少なくとも私にとっては)読みやすいです:

#include <stdio.h> 

int *f(void) { 
    static int data = 5; 

    return &data; 
} 

int main(void) { 
    int *ip = f(); 

    printf("%d\n", *ip); 
    return 0; 
} 
1

あなたはへのポインタへのポインタを渡す必要があり実際のポインタの値を変更してください:

void some_fun(int **p) 
{ 
    static int i = 10; 
    *p = &i; 
} 

これは、必ずしもそうするのはお勧めできません。私が考えることができる唯一の直接使用は、最初の使用までグローバルの初期化の実行を遅らせることです。

関連する問題