2017-01-04 3 views
18

これら2つのコード行のメモリ使用量に違いはありますか?int x [10]はどのくらいのメモリを割り当てますか?

int *a = malloc(10 * sizeof(int)); 
int b[10]; 

最初の行は、10の整数と1のポインタにメモリを割り当てる必要があります。しかし、私は第二のことについては分かりません。それはまた、10の整数と1つのポインタ、またはわずか10の整数のためにメモリを割り当てますか?

答えて

21

簡単に言えば:

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

割り当てポインタ*aの自動ストレージの少なくともsizeof(int*)バイト。 mallocが呼び出されると、これはあなたのプログラムのための動的なストレージの少なくともsizeof(int) * 10バイトを割り当てます。一方

:自動ストレージの

int b[10]; 

割り当て少なくともsizeof(int) * 10バイト。ここにはポインタはありません。あなたが表現(例:a = b)に名前bを使用する場合、それがポインタに崩壊します。しかし、aはポインタで、bは配列です。 C FAQ:C-FAQ Sec. 6: arrays and pointersでこれをチェックしてください。最も通常の場合

、「自動記憶」は「スタック」を意味し、「動的記憶装置」は、「ヒープ」を意味します。しかし、それは常に真実ではありません。この質問のこの用語についての少しの議論を読むことが望ましいかもしれません:"Why are the terms “automatic” and “dynamic” preferred over the terms “stack” and “heap” in C++ memory management?"

+7

それはまたは、コンパイラがどのように機能するかに応じて、ポインタ '* A'ために、スタック内の任意のメモリを割り当てない場合があります。どこでも '&a'を使用すれば、すべてのベットはオフになります。 –

+0

ありがとうございます。私は私の答えを思いつきます。 – giusti

+1

@DietrichEpp再び読んで、私はあなたの意見を誤解しているかもしれません。具体的な例を教えてください。 – giusti

8

最初のケースでは、a自体が自動ストレージのsizeof(int *)バイトを占めており、それは10 * sizeof(int)バイトのダイナミックストレージを指しています。後者の場合

bは、自動ストレージの10 * sizeof(int)バイトを占有します。 bは配列なので、ポインタはありません。

したがって、最初のケースではスタック全体で合計バイト数は少なくなります(スタックが自動ストレージに使用されていると仮定して)。

使用されるバイトの合計数が比較的少ない場合、自動ストレージは、典型的には結構です。大量の場合は、動的ストレージが優先されます。特にスタック実装では、大きすぎる自動変数が多すぎるとスタックがオーバーフローする可能性があります。

関連する問題