2013-08-15 19 views
5

私の現在の「静的」キーワードの理解は、変数の再初期化を防ぎ、関数の終了時に変数がメモリから離れることを防ぎます。Cのmain関数で静的変数を使用するのは意味がありますか?

Cでは、通常、変数をグローバルにする必要はないが、関数呼び出しの間では変更しないでください。

は今、STM32のためのいくつかのCコードで、私は次のことを見た(f.i.マイクロコントローラが割り込み):

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

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

これは、私が知りませんか、または単に割り込みや他の機能からコードをコピーし、プログラマが静的キーワードを削除することを忘れてしまった?

+2

CONSOLEBUFFERSIZEがVery Largeの場合、スタックがオーバーフローする可能性があるため、静的は安全です。 – sigmalha

+0

Cコンパイラは、スタック領域に 'main()'の変数を入れる義務はありません。したがって、変数を「スタック」から「データ」セグメントに移動するために「静的」を使用することは、コンパイラの実装に依存する。 'static'は、いくつかの答えによって示唆されるようにセグメントを変更するかもしれません。それは効果がないかもしれません。 – chux

答えて

12

1つの違いは、通常、静的変数はスタックの代わりにプログラムのデータセグメントを使用することです。おそらくbufferstatic(特にCONSOLEBUFFERSIZEが大きい場合)と宣言する理由が考えられます。いくつかのシステムでは

+0

これは実際には完全に理にかなっています。私はこのシステムのスタック境界が何であるのかは分かりませんが、スタック上の64バイトの永久割り当ては、避けたいもののように聞こえます。スタックのオーバーフローを防ぐのに役立ちます。 (64はCONSOLEBUFFERSIZEの現在の値です) – Graafvaag

+0

@Eric、正しい、私は編集します。ありがとう –

0

私はあなたが彼らのために多くのファイルやメインとCプロジェクトを作成するとき、その値が変更文句を言わないと思います....

+0

それはグローバル変数だった場合は、他のファイルでそれをexternに自由にして、それを使用するだろう... –

3

スタックは、固定され、限られたサイズです。このような場合、staticはバッファをスタックから移動し、リンカがより多くの領域を割り当てるように設定されている場所に置くだけで便利です。

さらに大きな初期スタックを提供するようにリンカーを再構成することも可能ですが、staticは簡単であり、それでも正しいことがあります。

関連する問題