如果在循环中声明了一个变量,之前的声明会变成垃圾吗?例如,在下面:
loop{
int array[10];
array[i]=......
}
array
为每个循环迭代声明。新声明时,数组分配的新内存位置是否与旧位置相同?如果不是,那么旧的声明是否会变成垃圾,因为分配的区域没有被释放?最后,如果数组像上面的例子一样是静态的,如何在不退出循环的情况下释放它?
你实际上并没有分配任何东西。这在堆栈上进行,堆栈帧的大小由编译器在编译时计算。该数组将在每次迭代时重用相同数量的堆栈空间。在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
任何东西。编译器会为你处理这些。
这是编译器自动处理的自动变量。
您只需要处理使用new
或分配给自己的存储空间malloc
。剩下的就交给你了。
array
每次进入循环时都会进入范围,并在每个循环结束时再次销毁。编译器很可能每次都重用相同的空间,但这不是由语言定义的。无论如何都不会有垃圾。
您可以假设,对于循环的每次迭代,都会创建一个新数组,并在迭代结束时将其销毁。这意味着新创建的数组的内容是未定义的。(可能是垃圾 - 它包含相同数据的可能性更大,因为它可能在堆栈中占据相同的位置)
但是,在内部,它们不会是Dervallint array[10]
所指出的任何分配或释放