分配和初始化之间的差异

时间:2014-02-02 13:44:04

标签: c

分配和初始化有什么区别?如果存在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;
}

3 个答案:

答案 0 :(得分:3)

  

分配和初始化有什么区别?

  • 分配是为变量分配一些内存的动作;
  • initalization 是在分配的内存中设置值的操作。
  

如果存在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时,初始化只进行一次。