【问题标题】:Can I increase the size of a statically allocated array?我可以增加静态分配数组的大小吗?
【发布时间】:2010-12-13 07:08:20
【问题描述】:

我知道增加动态分配数组的大小是可能的。

但是我可以增加静态分配数组的大小吗? 如果是,怎么做?

编辑:虽然这个问题是针对 C 语言的,但也要考虑其他语言。是否可以用任何其他语言?

【问题讨论】:

  • 你用什么语言工作?这将使一切变得不同。
  • 什么语言?了解这一点将帮助您理解为什么超出了静态分配数组的定义。
  • 这听起来像是一个糟糕(或诡计)的家庭作业问题。
  • 看样子应该是C
  • 我对这个“家庭作业”日复一日感到非常沮丧。问这样的问题有什么问题?这里的人有什么问题?你停止思考了吗?

标签: c arrays static-allocation


【解决方案1】:

在 VB .NET 中是:

Redim Preserve ArrayName(NewSize)

虽然不知道你用的是什么语言...

而且我不会经常使用这个命令......它的效率非常低。链表和不断增长的数据结构效率更高。

【讨论】:

  • 我也同意 Keith Randall 的观点,尽管我写的语句看起来好像重新定义了数组的大小,原因是它效率低下是因为在幕后它实际上只是制作了第二个静态数组的新大小,将值复制到其中,然后删除旧的。
【解决方案2】:

没有。它不是。这里有两种选择:

  1. 使用动态的
  2. 或者,冒着浪费内存的风险,如果您知道数组将存储的最大元素数,请相应地静态分配

是的,那是 C。

【讨论】:

    【解决方案3】:

    简单的答案是否定的,这是不可能的。因此名称为“静态”。

    现在,许多语言都有看起来像静态分配的数组,但实际上是静态分配的对动态分配数组的引用。那些你可以调整大小的。

    【讨论】:

      【解决方案4】:

      如果你小心点,你可以使用alloca()。该数组是在堆栈上分配的,但就代码样式而言,它很像您使用malloc(尽管您不必free,这是自动完成的)。我会让你决定是否称它为“静态”数组。

      【讨论】:

      • 你说的不是动态数组吗?
      • 我不完全确定您认为静态数组有什么用处。如果有用的部分是您不必担心释放它们(并且您不太关心该语言是否提供了创建它们的漂亮语法),那么 alloca 就可以了。
      • @Ravi:不,不像“动态生命周期”中的“动态”,因为由 alloca() 分配的数组具有自动生命周期(即与局部变量相同)。但是,它们的大小是在运行时确定的。
      【解决方案5】:

      没有。静态分配允许编译器做出各种假设,然后在编译过程中将这些假设纳入程序。

      这些假设包括:

      1. 将其他数据紧跟在数组之后是安全的(不会给您留下增长空间),并且
      2. 数组从某个地址开始,然后成为程序机器代码的一部分;您无法在某处分配新数组(并使用它),因为无法更新对地址的引用。

      (好吧,如果程序存储在 ram 中,引用可以更新,但是自修改程序非常不受欢迎,而且肯定比动态数组更麻烦。)

      【讨论】:

        【解决方案6】:

        从技术上讲,在 C 中甚至不可能增加动态分配数组的大小。

        事实上,realloc() 执行某种“创建新对象并复制数据”例程。它确实不会修改现有堆内存对象的大小。

        所以答案很简单,您无法在分配后更改 任何 对象或对象数组的大小,无论是动态分配还是静态分配。

        您可以做的是通过开发一个函数来使用相同的策略,该函数创建另一个具有所需大小的静态分配对象数组并复制数据。如果新的对象数组小于旧的对象数组,则差异内的值将被丢弃。

        唯一不同的是,新数组的大小,相当于旧数组的大小,需要在编译时固定。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-10-03
          • 2016-11-12
          • 2019-11-20
          • 1970-01-01
          • 2011-04-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多