0

当我以以下方式在 C 中声明一个数组时,所有 24 个字节都放入堆栈:

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

但是,当我使用这样的声明时,编译器会将数组放入 BSS RAM:

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

是否有规则可以放入堆栈的最长数组是什么,或者当我有一个本地数组时,它应该始终声明为静态?

4

1 回答 1

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

所有 25 个字节都放入堆栈。

24个字节,而不是 25 个。

是否有规则可以放入堆栈的最长数组是什么,或者当我有一个本地数组时,它应该始终声明为静态?

没有这样的规则,您只需要合理,其中“合理”取决于您的平台(例如,在具有 4k 堆栈的内核中,它比在通常具有 ~1MB 堆栈的用户空间应用程序中要少)。

但是,出于速度原因,我建议不要将本地数组更改为静态数组。函数静态变量仍然具有全局变量的缺点,即它们使函数不可重入。这可能是也可能不是问题,但是在处理过多的堆栈使用时,首选的解决方案应该是将变量移动到空闲存储区:

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