带有连续声明的C中的可用内存

时间:2012-04-19 08:53:54

标签: c linux

如果在循环中声明变量,先前的声明是否变为垃圾?例如,在以下内容中:

loop{

    int array[10];

    array[i]=......

}
为每个循环迭代声明

array。当它是新声明的时,该数组与旧位置分配的新内存位置是什么?如果不是,旧的声明是否变成垃圾,因为分配的区域没有被释放?最后,如果数组是静态的,如上例所示,如何在不退出循环的情况下释放它?

3 个答案:

答案 0 :(得分:7)

你实际上并没有分配任何东西。这会在堆栈上进行,堆栈帧的大小由编译器在编译时计算。每次迭代时,该数组将重用相同的堆栈空间。 int array[10]在运行时实际上没有任何效果。

这样做有很大的不同:

for (...) {
   int a[10];
   a[0] = x;
}

并且这样做:

for (...) {
  int* a = (int*)malloc(sizeof(int)*10);
  a[0] = x;
  free(a);
}

第一个“分配”的大小是固定的,不需要任何费用。第二个可以是可变大小,并且是一个堆分配的数组,您需要手动释放。 C没有垃圾收集的概念,所以没有什么真正变成垃圾。但是您需要使用malloc函数释放您分配的任何内容。如果你从不使用这个功能,你永远不需要free任何东西。编译器会为您处理。

答案 1 :(得分:3)

这是编译器自动处理的自动变量。

您只需要使用newmalloc来处理自己分配的存储空间。其余的都是为您处理的。

每次进入循环时array进入范围,并在每次循环结束时再次销毁。编译器很可能每次都重用相同的空间,但这并不是由语言定义的。无论如何都不会有垃圾。

答案 2 :(得分:0)

您可以假设,对于循环的每次迭代,都会创建一个新数组,并在迭代结束时销毁它。它意味着新创建的数组的内容是未定义的。(可能是垃圾 - 它包含相同数据的机会更多,因为它可能占据堆栈中的相同位置)

然而,在内部他们不会对 Dervall 指出的int array[10]进行任何分配或解除分配