1

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

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

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

4

6 回答 6

6

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

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

于 2009-11-05T04:37:34.347 回答
1

在 VB .NET 中它将是:

Redim Preserve ArrayName(NewSize)

不知道你在追求什么语言......

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

于 2009-11-05T04:36:28.950 回答
0

不它不是。这里有两个选项:

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

是的,那是C。

于 2009-11-05T04:36:52.550 回答
0

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

于 2009-11-05T04:50:20.667 回答
0

不会。静态分配允许编译器做出各种假设,然后在编译期间将这些假设纳入程序。

这些假设包括:

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

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

于 2009-11-05T05:12:56.600 回答
0

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

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

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

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

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

于 2020-01-15T13:20:19.410 回答