ベストアンサー
Cプログラムを実行すると、開いているファイルが3つあり、そのうち2つはSTDOUTという名前であることがわかっていると思います。 STDERRでは、通常のメッセージはstdoutに送られ(つまり、printfを呼び出すと)、エラーメッセージはstderrに送られます(たとえば、fprintf(stderr、…)を呼び出すと、この2つ(実際には開いているファイル)はOSによって直接リンクされます。 Unix端末またはWindows端末である端末に送信します。これらの最も重要な機能は、たとえば次の場合にUnixでリダイレクトできることです。ls| grepfile.txtシェルリダイレクトstdoutを「ls」にするとその出力の宛先は「grep」プロセスのSTDINであるため、grepはそのストリーム内のパターンなどを検索できます。これは強力なものであり、多くのUnixフィルター(実際にはプログラム)はこの方法で構築されており、強力です。
編集:より意味のある例を追加するより重要な例で物事を把握できるように、リダイレクトの新しいより明示的な使用法を追加しましょう。次のコマンドを見てください:
curl http://ftp.gnu.org/gnu/wget/wget-1.17.1.tar.xz | xzcat- | tar xvf-
ここで、curlはGNUプロジェクトからwgetのダウンロードを開始し、curlがデータをダウンロードしている間にSTDOUTに書き込みますが、シェルはcurlのstdoutをxzatのstdinにリダイレクトし、シェルは同じように、xzcatのstdoutをtarのstdinにリダイレクトすると、tarはデータの圧縮解除を開始します。驚くべきことです!
回答
まず、一般原則:何をしても、malloc()
が自動的に呼び出されることはありません。
struct
を宣言するときは、型を宣言します。型自体は、実行時にメモリを消費しません。
structタイプの変数を宣言すると、メモリが割り当てられますが、malloc()
は使用されません。変数がローカルの場合関数に対しては、通常、そのメモリがスタックに割り当てられます。これにより、Cで再帰性が可能になります。関数を呼び出すたびに(関数が内部から呼び出された場合でも)、スタックポインタが調整され、 loc用にスタックに新しいスペースが予約されていますその関数のすべての変数、および関数が終了するたびに、スタックは「巻き戻され」、そのすべてのスペースが解放されます。
グローバル変数を宣言すると、静的割り当てが行われます。プログラムの開始時のヒープであり、変数はプログラムの実行中ずっと使用可能です。必要なヒープサイズはコンパイル時にわかります。
対照的に、malloc()
を使用すると、メモリは実行時にオペレーティングシステムによってプログラムに動的に割り当てられます。 free()
を使用して解放する必要があります。そうしないと、プログラム(特に、サービスアプリケーションなど、再起動せずに長時間実行されるプログラムの場合)に問題が発生します。メモリリークが発生し、パフォーマンスに影響を及ぼし、極端な場合には、システム全体のリソースが不足します。 malloc()
の使用は、a)必要なメモリ量がヒープまたはスタックに割り当てられる量を超えている場合、またはb)必要なメモリ量がそうでない場合に最適です。事前にわかっています。