2017-02-06 9 views
-1

私はint型の配列がある場合:上記のように、それまでのmallocなぜmallocの片方向は失敗しますが、もう一方は失敗しますか?

int *array; 

array = malloc(5 * sizeof(int)); 

と私を、私はそれにアクセスし、それに値を設定することができます。すべて順調。

しかし私はint型のポインタを作成して機能し、malloc関数内部関数を渡す場合、私はポインタとして配列に渡しない限り、私は配列に/設定値にアクセスすることはできませんポインタに?私は配列をパラメータとして(INT **配列)を受け入れるすると間接参照、ポインタ(ポインタのようポインタ)のアドレスを渡し、そしてmalloc関数でそれを割り当てることができ、それを修正する

some_void_function(int *array) { 
    array = malloc(5 * sizeof(int)) 
} 

int *array; 
some_void_function(array); 

*(array + 3) = 5; // DOES NOT WORK 

some_void_function(int **array) { 
    *array = malloc(5 * sizeof(int)) 
} 

int *array; 
some_void_function(&array); 

*(array + 3) = 5; // WORKS 

誰かがこれを私に説明できますか?私は両方の状況で同じことをやっていませんか?アドレスを渡してから逆参照するだけで、最初の場所で単一のポインタを渡すのと同じことですか?

+0

どうすれば同じことができますか? 'some_void_function(array);を呼び出すことによって、' array'を変更していません。値によって渡されます。 –

答えて

2

ポインタはアドレスを保持する変数です。しかし、それらは他のすべてのタイプの変数と同じルールに従います。つまり、値渡しになります。

void some_void_function(int *array) { 
    array = malloc(5 * sizeof(int)) 
} 

arraysome_void_functionにローカルであり、その値に変更した内容は、それがからコピーされたポインタには反映されません。

void some_void_function(int **array) { 
    *array = malloc(5 * sizeof(int)) 
} 
  • リターン:あなたのポインタへのポインタを意味し、ポインタによって

    1. パス、:

      を呼び出すコードで(ポインタを含む)の変数を変更するには、次の2つのオプションがあります割り当てたアドレスをポインタに割り当てます。

      int* some_allocating_function() { 
          return malloc(5 * sizeof(int)) 
      } 
      //... 
      int *array = some_allocating_function(); 
      
    C becuaseの
  • +0

    *ポインタのローカルコピーが作成されていることを確認してください。だから、私が関数内でmallocを実行するとき、私は実際にmallocすることを期待しているポインタではなく、別のポインタ(ローカルのもの)にmallocしていますか? – Zhinkk

    +0

    @Zhinkk - 右:1つで:) – StoryTeller

    +0

    申し訳ありませんが、これは私にとっては別の混乱を招きます。ポインタが値渡しの場合、なぜこれは機能しますか? ボイド試験(INT *配列) {*(アレイ)10 を=}主に、配列が変更されます。しかし、あなたはポインタが値渡されたとは言いませんでしたか? – Zhinkk

    2

    thatsの値によって偶然にを通過

    some_void_function(int *array) { 
        array = malloc(5 * sizeof(int)) 
    } 
    

    このコードは単にarrayのローカルコピーは、それが発信者がarray

    このコード

    some_void_function(int **array) { 
        *array = malloc(5 * sizeof(int)) 
    } 
    

    パスでのコピーその変更doesntの変更呼び出し側配列のアドレス。これにより、関数から手を離して呼び出し側配列ポインタを変更できます。

    関連する問題