如果在循环中声明变量,先前的声明是否变为垃圾?例如,在以下内容中:
loop{
int array[10];
array[i]=......
}
为每个循环迭代声明 array
。当它是新声明的时,该数组与旧位置分配的新内存位置是什么?如果不是,旧的声明是否变成垃圾,因为分配的区域没有被释放?最后,如果数组是静态的,如上例所示,如何在不退出循环的情况下释放它?
答案 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)
这是编译器自动处理的自动变量。
您只需要使用new
或malloc
来处理自己分配的存储空间。其余的都是为您处理的。
每次进入循环时array
进入范围,并在每次循环结束时再次销毁。编译器很可能每次都重用相同的空间,但这并不是由语言定义的。无论如何都不会有垃圾。
答案 2 :(得分:0)
您可以假设,对于循环的每次迭代,都会创建一个新数组,并在迭代结束时销毁它。它意味着新创建的数组的内容是未定义的。(可能是垃圾 - 它包含相同数据的机会更多,因为它可能占据堆栈中的相同位置)
然而,在内部他们不会对 Dervall 指出的int array[10]
进行任何分配或解除分配