0

次のようにCで配列を宣言すると、24バイトすべてがスタックに入れられます。

void func(void){char array[24];} 

ただし、このような宣言を使用すると、コンパイラは配列をBSSRAMに配置します。

void func(void){static char array[24];}

スタックに入れることができる最長の配列は何ですか、またはローカル配列がある場合は常に静的として宣言する必要があるという規則はありますか?

4

1 に答える 1

3
void func(void){char array[24];} 

25 バイトすべてがスタックに入れられます。

25 バイトではなく24バイトです。

スタックに入れることができる最長の配列は何か、またはローカル配列がある場合は常に静的として宣言する必要があるというルールはありますか?

そのようなルールはありません。「合理的」はプラットフォームによって異なります (たとえば、4k スタックのカーネルでは、通常 ~1MB スタックのユーザー空間アプリケーションよりも少なくなります)。

ただし、速度上の理由から、ローカル配列を静的配列に変更しないことをお勧めします。関数の静的変数には、関数を再入不可にするというグローバル変数の欠点がまだあります。これは問題になる場合とそうでない場合がありますが、過度のスタック使用量に対処する場合の最初の選択肢の解決策は、変数をフリー ストアに移動することです。

void func(void){
  char* array=malloc(24); 
  /* do something */ 
  free(array); 
}
于 2012-06-14T14:06:02.210 に答える