2017-05-24 15 views
1

が、これは私のコードです:初期値(C言語)

void init_array(int** array) { 

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

    /* ???? **(array+2) = 666; */ 

    return; 
} 

void init(int* array, int* length) { 

    *length = 3; 

    *(array+0) = 0; 
    *(array+1) = 1; 
    *(array+2) = 2; 

    return; 

} 

int main(void) { 

    /* Variables */ 

    int array_length; 
    int* array; 

    /* Initialize */ 

    init_array(&array); 
    init(array, &array_length); 

    free(array); 

    return 0; 

} 

私の質問は:どのように私は、関数INIT_ARRAY(の配列の値を初期化することができます)。私は**(array+2)が働く必要があることをもたらすために来た私は鉛筆と紙を使用

  • **(array+2) = 666;
  • *(*(array+2)) = 666;
  • *array[2] = 666;
  • **array[2] = 666;

私は、次のような事をしようとしていますそれは私にセグメンテーションfを与えるault。

Cのポインタが実際にどのように動作するのか混乱しているので、私はあなたの答えに感謝します。

array 

あなたがポインタを取得することを間接参照にしたい:

*array 

はその後の結果に配列の添字演算子を適用し

+2

'(* array)[2] = 666;'を試し、すべての警告を表示してコンパイルしてください。 –

+0

私はC++に精通していますが、 'new'演算子やオブジェクトを宣言して指定されたアドレスに値を作成する必要があることを知っています。 – pandoragami

+0

Cで新しいことはありません。 –

答えて

3

あなたが関数に渡されたポインタのアドレスを持っています:

(*array)[2] 

または同等に:

*((*array) + 2) 

配列の添え字演算子[]は、逆参照演算子*よりも高い優先度を持つため、かっこが必要です。

一般に、読みやすいように、可能であれば配列添字演算子を使用してください。