繁体   English   中英

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

[英]Can I increase the size of a statically allocated array?

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

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

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

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

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

在 VB .NET 中,它将是:

Redim Preserve ArrayName(NewSize)

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

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

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

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

是的,那是C。

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

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

这些假设包括:

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM