0

重複の可能性:
宣言とmallocの違い

違いは何ですか:

char * a = malloc(size);  

char a[size];  

一方はもう一方よりも優れていますか?mallocを使用することに何か利点はありますか?

4

2 に答える 2

3

スタックに割り当てられたメモリのライフタイム スコープを制御することはありません。スコープが有効である限り有効です (静的にしない限り)。

mallocヒープにメモリを割り当てるためのものです。freeその記憶を呼び出すまで有効です。

通常、実際には新しいメモリを割り当てていないため、スタックにメモリを割り当てる方が高速です。すでに使用しているものをさらに予約しているだけですが、ライフタイムを制御していないため、スコープによって制御されます。ブロックまたは関数。

于 2012-12-16T14:28:31.033 に答える
2

char *a = malloc(size);と char *a[size];`の違いは何ですか?

最初のものは、へのポインターを宣言し、ヒープにバイトをchar割り当てます。2 番目のものは、ポインターの断片をsize割り当てます。それらは同等ではありません。sizechar

一方は他方よりも優れていますか?

いいえ、用途が異なります。

を使用する利点はありますmalloc()か?

はい。関数から配列を返したい場合、これはできません:

char a[size];
return a;

thenaは戻り後に範囲外になり、それを使用すると未定義の動作が発生するためです。したがって、この場合は使用する必要があります

char *a = malloc(size);
return a;

(関数から毎回新しい文字列を返したいと思われるため、一般的にはこれが当てはまります。ただし、これが必要でない場合は、ローカルで宣言された静的配列を使用できます。)

ただし、配列をローカルでのみ使用する場合は、自動 (スタック) 配列を使用することをお勧めしますmalloc()。これは、メモリの断片化の増加を回避し、スタック操作がヒープ アクセスより高速になる可能性があるためではありません。

于 2012-12-16T14:31:01.780 に答える