我可以增加静态分配的数组的大小吗?

时间:2009-11-05 04:33:51

标签: c arrays static-allocation

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

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

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

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

在VB .NET中它将是:

Redim Preserve ArrayName(NewSize)

不确定你之后会遇到什么样的事情......

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

答案 2 :(得分:0)

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

  1. 使用动态
  2. 或者,冒着浪费内存的风险,如果您对阵列将存储的最大元素数有所了解,请相应地进行静态分配
  3. 是的,那是C。

答案 3 :(得分:0)

如果您小心,可以使用alloca()。数组是在堆栈上分配的,但就代码风格而言,如果你使用malloc(你不需要free,那就是自动完成)。我会让你决定是否称之为“静态”阵列。

答案 4 :(得分:0)

没有。静态分配使编译器有权进行各种假设,然后在编译期间将这些假设烘焙到程序中。

这些假设包括:

  1. 在阵列之后立即放置其他数据是安全的(不会让你有空间增长),
  2. 数组从某个地址开始,然后成为程序机器代码的一部分;您无法在某处分配新数组(并使用它),因为无法更新对该地址的引用。
  3. (好吧,如果程序存储在ram中,引用可以更新,但是自修改程序非常不受欢迎,而且肯定比动态数组更麻烦。)

答案 5 :(得分:0)

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

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

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

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

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