4

私はCの学習に取り組んでいます。ユーザーの要求なしに変更または破損できないバイトのブロックを割り当てることは理解してmalloc()いますが、非常に頻繁に使用しています。正確には、将来参照したい構造体またはその内容を作成するたびに、malloc を使用しています。free()また、完了時に割り当てられたメモリについても理解しています。

私のmallocの使用は正しいですか?

4

3 に答える 3

2

動的メモリ割り当て (mallocおよびファミリ) が存在する理由は 2 つあります。

  • データは、それを割り当てたスコープを超えて存続する必要があります (マルチスレッドなど)。
  • あなたが割り当てているものは何でもあなたのスタックには大きすぎます

他の理由で動的メモリを割り当てることは本当に避けるべきです。自動 (スタック) 変数は、エラーが発生しにくく、スコープの最後で自動的に割り当てが解除されます。

あなたが呼ぶような「破損したメモリ」を持つことは、実際には悪いプログラミングからのみ発生する可能性があり、スタックとヒープの両方で発生する可能性があり、メモリの破損につながるバッファオーバーフローやその他の間違いから安全を確保するために動的メモリに頼るべきではありません。

C 標準ライブラリの多くの関数が、結果を格納する引数としてバッファへのポインタを取得するのには理由があります。これにより、これらのバッファをスタックに割り当てることができます。例えば:

 ssize_t read(int fd, void *buf, size_t count);

また、別の回答で述べたように、スタックメモリはすでに CPU キャッシュにあるため、はるかに高速にアクセスできます。

于 2013-10-07T08:40:59.587 に答える
1

他のタイプの割り当ても検討してください。

int foo;

ブロックの外側では、グローバル変数が割り当てられます。この変数は、プロセスの存続期間全体にわたって有効であり、プログラムの他のモジュールから表示されます。

static int foo;

ブロックの外側は同じですが、実際のモジュールでのみ表示されます。

int foo;

ブロック内のコードは、ブロック内のコードが実行されている間のみ有効であり、その後破棄されます。

static int foo;

ブロック内はブロック内でのみ表示されますが、その値はプロセスの存続期間全体にわたって保持されます。

私は多くの組み込み C コーディングを行っており、malloc() の使用は絶対に禁止されています。そして、それは完全に可能です。コンパイル時に問題のサイズがわからない場合は、通常、malloc() が必要です。ただし、そのような場合でも、動的メモリ割り当てを再帰、行ベースの処理などの他の手法に置き換えることができます。

于 2013-10-07T05:50:57.990 に答える
0

それはあなたが何を意味するかによって異なります

ユーザーの要求なしに変更または破損することはできません

コードを参照している場合、通常はユーザーではなくクライアントと呼ばれます。そして、それが何を意味するのかはまだ不明です。しかし、それは重要ではありません。

ポイントはmalloc()、動的メモリ割り当てに使用される関数の 1 つです。これは、この関数によって返されたアドレスを別の場所に渡すことができ、そこに格納されたデータは手動で割り当てが解除されるまでそこにあることを意味します。スコープ外になると自動的に解放される静的メモリ割り当てとは異なります。

したがって、malloc()それによって割り当てられたメモリが同じスコープで解放される場合は、おそらく使用しないでください。これは、意味がなく、静的割り当ての方が高速であるためです。これは、CPU がキャッシュしやすく、実行時にヒープとしてではなく、プログラムの起動時に初期化されるためです。割り当てられたメモリ。

于 2013-10-07T05:52:35.367 に答える