2016-05-11 7 views
-4

は、関数の呼び出しの2例を考えてみましょう。C関数の引数とポインタ

今すぐ下記の場合:

void Convert(int number, int *staticPointer) 
{ 
    int * dynamicPointer = malloc(sizeof(int)); 
    *dynamicPointer = number; 
    staticPointer = dynamicPointer; 
} 

int main() 
{ 
    int *p; 

    Convert(5, p); 

    printf("The number is: %d", *p); 

    free(p); 
} 

これは、セグメンテーションフォールトが発生します。異なるパラメータでさまざまな方法で関数を呼び出すことに注意してください。違いは関数の呼び出しであることを理解しています。

誰かが私に最初の例のように関数を呼び出さなければならない理由を教えてください。なぜ、他の例が機能しないのですか(メインでクラッシュします)?

私のプログラムの目的は、関数を介して特定のメモリアドレスへの静的ポインタを参照することです。

+1

最初のものは 'main()'関数でポインタを変更します。 2番目の関数は 'Convert()'関数でポインタのコピーを変更しますが、 'main()'関数のポインタは変更しないので、 'main()'のポインタは初期化されていません。あなたにそれが間違っている(それは保証されていない)ことを伝えるためにクラッシュしました。 –

答えて

0

あなたが変更している二つのことがあります。

  • 機能タイプ
  • 関数の呼び出しあなたは、ポインタ値を変更したいので、あなたは、ポインタへのポインタを提供する必要が

intに。

ポインタのポインタについては、resourcesを参照してください。

0

Cは、関数パラメータの受け渡しに値渡しを使用します。最初のケースで

  • 、ポインタpアドレスを渡すことによって、あなたは、ポインタ自体を変更することができました。したがって、main()の変更となり、となります。

  • ポインタは、それ自体が値渡しであるため、変更することはできません。 Convert()機能から戻ると、pに加えられた変更は失われます。したがって、main()では、無効なメモリ(*p)にアクセスしており、nvokeはundefined behaviorです。したがって、クラッシュ。

関連する問題