2

次のように定義された文字列の間に(構文とパフォーマンスの点で)違いがあるかどうか疑問に思っていました

char str[200];

char *str;
str = calloc(200, sizeof(char));

使用上の違いはありますか?(例: 互換性がない、strncpyまたは何か) そして、さらに重要なことに、パフォーマンスの点で違いはありますか?

編集:char * and で定義された配列callocが拡大および縮小できることは理解していますが、何らかの理由でスタック メモリよりもヒープ メモリを選択する必要がありますか? それが私が本当に尋ねようとしていたことです。

4

7 に答える 7

4

char str[200]calloc()asがヒープ メモリに割り当てられるのに対し、スタック メモリに割り当てられます。

calloc() の性質上、calloc() によって割り当てられたすべてのバイトに 0 が割り当てられます。

スタックとヒープの比較については、以下を参照してください

どちらが速いですか: スタック割り当てまたはヒープ割り当て

http://www.linuxquestions.org/questions/programming-9/stack-faster-than-heap-685004/

スタックとヒープとは何ですか?

于 2012-12-12T09:25:10.850 に答える
3

使用上の違いはありますか?(たとえば、strncpy などと互換性がありません)

最初の str ie 配列名が定数ポインターに評価され、再割り当てできないことを誰も言及していないことに驚いています.2番目のものは再割り当て可能なポインター変数です

そう

char str[SIZE];
char * b = malloc(SIZE);

str = b; // This is a compilation error

b = str; // where as this is perfectly legal (ignoring the fact 
         // that we are losing malloced memory without actually freeing it)
于 2012-12-12T09:43:04.927 に答える
1

char str[200];

  • 単純な宣言(動的割り当てではない)であり、
  • デフォルト値はガベージですが、
  • 高速アクセス(スタックセグメント内)、
  • Scope is local(以内に {})。

char * str;
str = calloc(200、sizeof(char));

  • すべての要素の値はゼロです(なぜならcalloc())、
  • アクセスが遅い(ヒープセグメントの使用)、
  • メモリの効率的な使用である動的割り当ての使用。
  • 明示的に割り当てを解除する必要があります。
  • メモリ、例えば関数から Scope is global戻ることができます` 。return str
于 2012-12-12T09:26:51.443 に答える
1

最初にスタックにメモリを割り当て、次に動的メモリを割り当てます。スタック メモリは自動管理されますが、動的メモリは手動で管理する必要があります。

選択肢がある場合は、常に最初のものを優先する必要があります。

  • 何かを解放することを覚えておく必要はありません
  • 動的メモリには、パフォーマンスに関するオーバーヘッドがほとんどありません。

使用上の違いはありますか?(たとえば、strncpy などと互換性がありません)

関数での使用に関しては、両方とも似ています。単純な意味で、関数で使用する場合、両方ともメモリの連続したブロックを指すポインターです。配列を関数に渡すと、最初の要素へのポインターとして減衰します。
違いは、それらが保存される場所と、自動管理か手動管理かです。

于 2012-12-12T09:25:37.580 に答える
0

可能な限り、スタック割り当てを使用する必要があります。プログラマにとって保守が容易であり、パフォーマンス面での要求も少なくなります。

配列スタックの割り当てができない場合が多くあります。

  • コンパイル時に配列のサイズがわからない場合。ただし、最近の C 標準ではこれがサポートされていますが、
  • サイズがすべて同じではない配列の配列がある場合、
  • 関数が戻った後も保持するには、割り当てられたメモリが必要です。

char str[200]また、 はそのサイズ (つまり ) を「認識」しているsizeof(str) == 200*sizeof(char)のに対し、割り当てられた配列のサイズを補助変数 ( sizeof(str) == sizeof(char*)、通常は 4 または 8)に記憶する必要があることに注意してください。

于 2012-12-12T09:39:52.910 に答える
-1

文字配列メモリはスタックに割り当てられます。制御が配列を含む関数から外れるとすぐに、メモリの割り当てが解除され、配列にアクセスできなくなります。

calloc関数はヒープにメモリを割り当て、プログラムが実行されるか、メモリが手動で割り当て解除されるまで残ります。

于 2012-12-12T09:27:26.397 に答える