2016-05-19 2 views
2

代わりに可変長配列を使用することができますが、動的メモリ割り当てが必要なのはなぜですか?代わりに可変長配列を使用できるのに、なぜ動的メモリ割り当てが必要なのですか?

unsigned int x,*p; 
printf("Enter size:"); 
scanf("%d",&x); 
p = (unsigned int *)malloc(x); 
:また、我々は、動的メモリ割り当て機能のいずれかを使用して、実行時にメモリを割り当てることができる

unsigned int x; 
printf("Enter size:"); 
scanf("%d",&x); 
int arr[x]; 

我々は、可変長配列で実行時に動的メモリを割り当てることができ

したがって、どちらの場合でも実行時にメモリを割り当てることができます。なぜ、可変長配列を代わりに使用できるのですが、なぜ動的メモリ割り当てが必要なのですか? ダイナミックメモリ割り当て関数を配列よりも使用するとどんなメリットが得られますか?

配列を渡すための編集コード:

unsigned int *func(unsigned int *p) 
{ 
    *p=10; // any processing on array 

    return p; // we could return a pointer to an array 

} 

int main() 
{ 
    unsigned int x,*P; 
    printf("Enter size:"); 
    scanf("%d",&x); 
    unsigned int arr[x]; 

    p = func(arr); 
} 

答えて

0

int arr[x]ので、xはあなたの例のように変数の値であるとき、有効な標準C(またはC++)コードではありません。

少なくとも、標準化されたバージョンのC++(C++ 98、C++ 03、C++ 11、C++ 14)と、最初のC言語スタンダード化(C89)。

可変長配列はC99では使用できますが、次の(現在の)C11標準ではオプションです。

C99準拠のコンパイラを使用している場合にのみ、可変長(割り当てられていない)配列に依存することができます。決してC++ではありません。

p.s .:申し訳ありませんが、私の悪い英語です。

+0

@ Serge Ballesta - まあ、複雑です。質問は「C」とタグ付けされていませんでした。私は "C"タグだけを追加して編集しました。 "C++"ではなく、別のタグのための場所があり、イスラムは 'malloc()'を使用し、 'new'では使用しませんでした。しかし、IMHO、質問は両方の言語をカバーする答えが必要です。 – max66

+0

@ Serge Ballesta - それはOKです;-)。あなたの答えを読む私は、イスラム教徒がダイナミックに割り当てられた記憶の有用性に疑問を抱いていた可能性が高いことを理解しています。だからあなたの答えは私のものより良いと思います。しかし、私は可変長配列が正しい標準C/C++(C99とオプションでC11を除く)でないことも彼に説明するのが適切だと考えています。リクエスト:答えを簡単に編集して、この部分を追加してもいいですか? – max66

+0

あなたはその答えをここに残すべきだと思います。VLAは信頼できるコンセプトではなく、Cであっても私にとって素晴らしい補完物です。 –

2

異なる使用例があるためです。

自動メモリは、呼び出しルーチンで割り当てるときに使用します。そのメモリは呼び出し先に任意で渡すことができます。しかし、あなたはそれを呼び出し元に返すことはできません。

は、データを格納するために、不透明な構造を使用するライブラリを想像 - APIは、このシグネチャを持つルーチンを持っている可能性があるC.におけるOOPの種類:

void * buildEltOfTypeXX(param1, param2, ...); 

を不透明な構造体を作成し、初期化します。その場合、メモリがダイナミックアロケーション(malloc)を使用しなければならず、ダングリングポインタを返すので自動ではないことが明らかです。そしてそのパターンでは、発信者はという所有権をメモリのにし、もはやそれを必要としなくなったら解放する必要があります。

+0

@ Serge私は配列のアドレスを呼び出し側に返すこともできます。実際には配列を渡さず、アドレスをコピーします最初の要素の私の投稿に書いた編集済みのコードを見てください。違いはありません – Islam

関連する問題