2017-09-08 4 views
3

私は今、C言語を学んでいて、いくつかのことを明確にしたかったのです。mallocを使用するポインタは配列と見なすことができますか?

int *arr = malloc(10 * sizeof(int)); 

私はこのケースでは、ARRは相当を割り当てられているポインタである、ということを理解:

私たちは、動的配列を作成したい場合、我々は次のコード行を使用することができることを学んできましたバイト単位で10の整数の配列私はまた、[9]。

それがメモリを割り当てられているすべてのポインタを配列として扱うことができる意味していますが、[0] ARRするARRから(配列としてARR扱うことができることを理解できますか?

枚このをできました配列として扱われる?

int *single = malloc(sizeof(int)); 

それとも、これは配列として扱われるだろうか?配列のサイズを無視

int *half = malloc(sizeof(int) * 1.5) 
+2

'int * single = malloc(sizeof(int));は' int single [1]; 'に対応します。 'single [0]'や '* single'として使うことができます。 「半分」も同じです。 – BLUEPIXY

+0

2番目のものは6バイトを割り当てますが、 'int half [1]'配列としてしか使えません。 @JonathanLeffler; –

+0

; 'malloc'は' size_t'型の引数とsize_'型の 'unsigned'型を想定しています。 'malloc(sizeof(int)* 1.5)'のように)floatを 'malloc'に渡すべきではありません。 – haccks

答えて

4
  • 、はいすべてポインタは配列(インデックスを付けることができる)を使用できます。
  • 要素の数は、有効なアクセスのために切り捨てられた整数でなければなりません(つまり、1.5は1項目を意味します)。
  • あなたはmallocからバイト数を要求しますが、これはアイテムサイズの倍数であることが理にかなっています。
  • ポインタ演算についてお読みください。
  • 配列名はポインタ(例:*配列)として使用することもできますが、割り当てることはできません(++配列など)。
1

これは配列として扱うことができますか?

int *single = malloc(sizeof(int)); 

確かに、それは、配列int single[1]

それとも、これは配列として扱われる可能性として扱うことができますか?

int *half = malloc(sizeof(int) * 1.5) 

はい、それは以前のスニペットと同じ効果を持ちますが、あなたはわずか2つの追加バイトを浪費することになります。半分[2]で書き込もうとすると、いくらかのメモリが壊れる可能性があります。

関連する問題