5

「static」キーワードに関する私の現在の理解によると、変数が再初期化されるのを防ぎ、関数が終了したときに変数がメモリから離れることを防ぎます。

C では、通常、変数がグローバルである必要はないが、関数呼び出し間で変更されるべきではない場合にこれを使用します。(fi マイコン割り込み)

さて、STM32 の一部の C コードで、次のようになりました。

int main(void)
{
  static char buffer[CONSOLEBUFFERSIZE];
  ...

私には、これは意味がありません。この変数は、終了文字を受信したときにコマンドを処理するために、受信コマンドをバッファするために使用されます。しかし、前に説明した「静的」の 2 つのプロパティは、メイン関数には適用されません。これは、main() が 1 回だけ呼び出され、終了しないためです。だから私の実際の質問:

これは、私が知らないホーカスポーカスを使用している可能性がありますか、それとも単に割り込みまたは他の関数からコードをコピーしたものであり、プログラマーが static キーワードを削除するのを忘れたか、わざわざ削除しなかったのでしょうか?

4

3 に答える 3

12

1 つの違いは、静的変数は通常、スタックではなくプログラムのデータ セグメントを使用することです。bufferおそらくそれがasと宣言する理由ですstatic(特に ifCONSOLEBUFFERSIZEが大きい場合)。

于 2013-08-15T09:28:05.797 に答える
3

一部のシステムでは、スタックは固定の制限されたサイズです。このようstaticな場合、単純にバッファをスタックの外に移動し、リンカーが設定されている場所に配置して、より多くのスペースを割り当てると便利です。

リンカーを再構成して、より大きな初期スタックを提供することも可能ですが、staticより簡単で、正しいことを行います。

于 2013-08-15T09:42:25.417 に答える
0

多くのファイルとそれらのメインでacプロジェクトを作成すると、その値は変わらないと思います....

于 2013-08-15T09:32:06.190 に答える