3

我问过一个关于在 for 循环中声明数组的问题,例如

for(i=0;i<=1000;i++){
    float arrayone[(length[i])];
    do a bunch of other stuff
}

基本上,我正在尝试做一个数组,其长度可以根据程序所在的步骤而变化。我不想永久保存数组数据(如arrayone [] []),因为它很大并且有很多步骤。

所以有人告诉我,像这样在这个范围内声明数组是合法的。但它会在最后尝试存储 1000 个数组副本吗,这是我不想要的吗?我是一个初学者,所以我不明白这些块真正做的细微差别。

对我来说,另一种选择是在循环之外创建一个数组,该数组具有所需的最大长度,并在每一步都覆盖它。

编辑:数组的用途是:我有一个全局数组。循环中的数组使用该全局数组填充函数结果,以节省计算。数组被操纵,...,...,最后用于更改全局数组。然后他们就不再需要了。

4

2 回答 2

7

但它会在最后尝试存储 1000 个数组副本吗,这是我不想要的吗?

不,在每次迭代开始时都会分配一个新数组,并且由于数组在迭代结束时超出范围,届时它将被释放,因此一次只存在一个数组。

这就是自动变量(该数组就是)的意义所在。在声明它们的范围结束时(通常但不总是用大括号分隔),它们会自动释放。

于 2012-04-11T20:23:24.607 回答
0

循环的每次迭代完成后,循环内声明的所有变量都将被销毁,包括您的数组。因此,您的阵列只会保留一份副本。

但是,话虽如此,您应该知道在循环之外初始化数组可能会更好,因为您不必每次迭代都在堆栈上分配内存。

如果您像这样动态分配数组(不在您的示例中):

    for(i=0;i<=1000;i++){
      float * arrayone = (float*)malloc(i * sizeof(float));
    }

那么你就有问题了。这里的局部变量是指针,当它被销毁时,您将无法再访问您分配的内存。在这种情况下,您将一次在内存中拥有 1000 个不同的数组。您可以free在指针被销毁之前保留您的记忆,但我认为在循环之外声明数组仍然更好。

于 2012-04-11T20:28:37.367 回答