取决于C编译器和编译器标志的版本,可以在函数的任何地方初始化变量(据我所知)。C函数和变量的内存分配C
我习惯于把所有的变量放在函数的顶部,但是如果在函数的任何其他地方定义了变量的话,讨论就开始关于变量的内存使用。
下面我写了2个简短的例子,我想知道是否有人能解释我(或验证)内存如何分配。
示例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
}
代码示例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
}
好了,这意味着它实际上是更有效的这种方式,而不是代码时把所有的变量在顶部的地方可能不是很清楚,当它超出了范围或何时使用?或者这仍然没有关系? – koldewb
@koldewb编译器无关紧要,因为它可以计算出变量的活动使用区域,并相应地分配内存。然而,阅读你的代码的人很重要,所以把变量放在离他们使用的地方更近的地方比在顶部声明所有东西要好。 – dasblinkenlight