【问题标题】:Array in for loop, C99for循环中的数组,C99
【发布时间】:2012-04-24 04:37:54
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 选择您的替代解决方案
  • 你真的会问问题吗?我没有看到。
  • 分享数组的作用是个好主意,也许有比这更好的方法。
  • @abelenky “但它会在最后尝试存储 1000 个数组的副本,这是我不想要的吗?”我认为这是一个完全有效的问题,不值得投反对票。

标签: c arrays loops for-loop


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢!我想这就是我需要知道的一切。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 在栈上分配内存非常便宜,如果你在循环之外分配它,那么你必须增加在数组中找到最大数的复杂性,如果这还不知道的话。跨度>
  • @Seth 如果通过找到数组中的最大数字,您的意思是确定数组大小并没有增加复杂性,因为您必须知道数组的大小才能创建它。无论您在循环内部还是外部声明数组,其他所有内容都完全相同。至于便宜,比不每次迭代都分配内存便宜多少?
  • 不,我的意思是你必须找到length 持有的最大数,因为你需要数组的大小与length 数组中的最大数相同,这样你就可以创建一个足够大的数组,以包含您在循环内创建的任何数组(请注意,每个数组的长度计算为length[i])。此外,在堆栈上分配内存通常是一条汇编指令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-03
  • 2017-01-03
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多