コメントはすでにこれをカバーしていると思います...
メモリを要求するということは、malloc しているメモリを管理するオペレーティング システムがあることを意味します (オペレーティング システムという用語の大まかな意味を使用して)。まず、一般的なルールとして、マイクロコントローラーでメモリを割り当てるべきではありません (私はその発言に怒りを覚えるかもしれません)。場合によっては実行できますが、メモリを制御しているのはあなたです。アプリケーションでシステムを所有しているのはあなたです。メモリを要求するということは、それを自分自身に要求することを意味します。
構造体または配列を静的に割り当てることができない、またはスペア メモリの大部分またはすべてを必要とする可能性のある相互に排他的なコード パスがある場合に共用体を使用できない理由がない限り、動的に割り当てて解放することを試みることができますが、それは難しいシステムです。解決するエンジニアリングの問題。
実行時のメモリ割り当てとコンパイル時間には違いがあります。あなたの例は、質問の残りの部分とは何の関係もありません
int i=0; int d=3;
コンパイラはコンパイル時に、これらの項目ごとに .data 内の 2 つの場所を割り当てます。リンカおよび/またはスクリプトは、.data が存在する場所とそのサイズに関する制限を管理します。.data が利用可能なものよりも大きい場合は、リンカの警告を受け取る必要があります。そうでない場合は、リンカ コマンドまたはスクリプトを修正して、システム。
実行時の割り当ては実行時に管理され、メモリを管理する場所と方法はそのライブラリによって決定されます。メモリが十分にある場合でも、不良または不適切に作成されたライブラリは、.text、.data、.bss、および/またはスタックとオーバーラップして原因となる可能性があります。多くの問題。
スタックの過度の使用は、非常に深刻なシステム エンジニアリングの問題でもあります。非組み込みシステムから発生するものは、メモリが非常に多いため、最近では見過ごされがちです。マイクロコントローラ上の組み込みコードを扱う場合、これは非常に現実的な問題です。最悪の場合のスタック使用量を知る必要があります。動的に割り当てるヒープがある場合、または静的に割り当てる場合でも、少なくともそれだけのメモリの余地を残しておく必要があります。