分配和初始化有什么区别?如果存在int和静态int,则下面的变量x被分配多少次?
int main(){
int i = 2;
int j;
for(j = i; j < 20; j++){
int x = 5;
//static int x =5;
printf("\n x = %d \n",x);
}
return 0;
}
答案 0 :(得分:3)
分配和初始化有什么区别?
如果存在int,则下面的变量x被分配多少次?
for(j = 2; j < 20; j++){
int x = 5;
…
}
在该示例中,变量x
被分配18次,并在每次迭代时解除分配。虽然编译器可能会优化并重用该变量分配的空间以节省几个周期。并且该变量也被初始化了18次。
和静态int?
for(j = 2; j < 20; j++){
static int x = 5;
…
}
静态变量x
将被分配一次,并且永远不会被释放,因为编译器无法判断该函数是否可能在程序的后期再次被调用(即使它对程序员来说很明显)。静态变量也只会被初始化一次。要展示静态变量的行为,请测试以下程序:
void foo() {
for(int i = 0; i < 20; i++){
static int x = 5;
printf("%d\n", x);
x = 2;
}
}
int main(){
foo();
return 0;
}
将产生一个5
和17 2
。
HTH
答案 1 :(得分:2)
标题上写着“分配和初始化”,问题是“分配和声明”。
两种情况
这实际上取决于编译器的实现。如果声明了变量但从未使用过,则智能编译器会产生警告,而不是在堆栈上完全分配它。
分配意味着在堆栈(或堆,如果其malloc
ed)上提供空间。初始化意味着为变量赋值。而声明告诉编译器该变量存在。它也可能意味着变量存在于某个其他目标文件中,如果它前面有extern
。
要回答你的第二个问题,它的编译器依赖...如果编译器发现变量的值没有改变,那么int x
将被分配一次。分配基本上是将调用堆栈向上移动几个槽以容纳数据。并且释放将调用堆栈向下移动几个槽(或者如果您愿意,则为字节)。
另一方面,static int
仅在堆栈存储区域外分配一次,通常在程序完成执行之前不会释放变量。
答案 2 :(得分:0)
由于变量x在循环内声明,因此其范围仅在循环内。因此,每次控件完成循环时,都会销毁变量。然后当它到达循环体时重新初始化。
但是当声明为static时,初始化只进行一次。