1

如果在循环中声明了一个变量,之前的声明会变成垃圾吗?例如,在下面:

loop{

    int array[10];

    array[i]=......

}

array为每个循环迭代声明。新声明时,数组分配的新内存位置是否与旧位置相同?如果不是,那么旧的声明是否会变成垃圾,因为分配的区域没有被释放?最后,如果数组像上面的例子一样是静态的,如何在不退出循环的情况下释放它?

4

3 回答 3

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任何东西。编译器会为你处理这些。

于 2012-04-19T08:57:01.387 回答
3

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

您只需要处理使用new或分配给自己的存储空间malloc。剩下的就交给你了。

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

于 2012-04-19T09:03:03.203 回答
0

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

但是,在内部,它们不会是Dervallint array[10]所指出的任何分配或释放

于 2012-04-19T09:12:56.230 回答