C中函数和变量的内存分配

kol*_*ewb 3 c memory embedded stack

依赖于C编译器和编译器标志的版本,可以在函数中的任何位置初始化变量(据我所知).

我习惯将所有变量放在函数的顶部,但讨论开始时关于变量的内存使用,如果在函数的任何其他位置定义的话.

下面我写了两个简短的例子,我想知道是否有人能解释我(或验证)如何分配内存.

示例1:变量y是在可能的返回语句之后定义的,有可能这个变量不会被用于这个原因,据我所知这没关系,代码(内存分配)将是如果变量放在函数的顶部,则相同.它是否正确?

示例2:变量x在循环中初始化,这意味着此变量的范围仅在此循环内,但此变量的内存使用情况如何?如果放在功能的顶部会有什么不同吗?或者只是在函数调用的堆栈上初始化?

编辑:总结一个主要问题:减少变量的范围或更改第一次使用的位置(所以在其他任何地方而不是顶部)对内存使用有影响吗?

代码示例1

static void Function(void){
 uint8_t x = 0;

 //code changing x
 if(x == 2)
 {
  return;
 }

 uint8_t y  = 0;    
 //more code changing y
}
Run Code Online (Sandbox Code Playgroud)

代码示例2

static void LoopFunction(void){
 uint8_t i = 0;

 for(i =0; i < 100; i ++)
 {
  uint8_t x = i;
  // do some calculations
  uartTxLine("%d", x); 
 }

 //more code
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

我习惯把所有变量都放在函数的顶部

过去在旧版本的C中需要这样,但现代编译器放弃了这一要求.只要他们在第一次使用时知道变量的类型,编译器就会获得所需的所有信息.

我想知道是否有人能解释我如何分配内存.

编译器决定如何在自动存储区域中分配内存.实现不仅限于为每个变量声明一个单独位置的方法.允许它们重用超出范围的变量的位置,以及在某个点之后不再使用的变量.

在你的第一个例子中,变量y被允许使用以前被变量占用的空间x,因为第一个使用点y是在最后一个使用点之后x.

在第二个示例中,用于x循环内部的空间可以重用于您可以在该// more code区域中声明的其他变量.

  • @koldewb对编译器无关紧要,因为它可以找出变量的活动使用区域,并相应地分配内存.但是,对于阅读代码的人来说,这很重要,因此将变量放在更接近使用它们的地方比在顶部声明所有内容更好. (6认同)