【问题标题】:malloc and other associated functionsmalloc 和其他相关函数
【发布时间】:2012-11-27 23:10:33
【问题描述】:

我有一个名为“ArrayA”的数组,它充满了整数,但我想在每次满足条件时再向数组末尾添加 5 个单元格。我该怎么做? (互联网不是很有帮助)

【问题讨论】:

  • 如果它是一个真正的数组,你不能。如果它是用作数组的malloced 内存块,realloc 是您的朋友。
  • “互联网不是很有帮助” - 嗯,你现在在互联网上。你在寻求帮助。人们在帮助你。你最好不要说这样的话……
  • @user1744194 Sr. 如果您的问题已得到回答,请考虑接受其中之一。所以其他人会知道这个问题已经解决了。看这里如何接受和回答meta.stackexchange.com/questions/5234/…

标签: c malloc calloc


【解决方案1】:

如果这是一个静态数组,您将不得不创建一个具有更多空间的新数组并自己复制数据。如果它是用 malloc() 分配的,正如您的问题的标题所示,那么您可以使用 realloc() 或多或少地自动执行此操作。请注意,您的数组的地址通常会发生变化。

正是因为需要“动态”数组根据需要增长(和缩小),所以像 C++ 这样的语言引入了向量。他们在幕后进行管理。

【讨论】:

    【解决方案2】:

    您需要realloc 函数。

    另请注意,添加 5 个单元格并不是最佳性能解决方案。 每次需要增加数组时,最好将数组的大小加倍。 使用两个变量,一个用于size(使用的整数个数),一个用于capacity(数组的实际内存大小)

    【讨论】:

      【解决方案3】:

      在现代操作系统中,通常可以安全地假设,如果您分配 大量 不使用的内存,那么它实际上不会消耗物理 RAM,而仅作为虚拟映射存在。一旦第一次使用页面(今天通常以 4Kb 的块),操作系统就会提供物理 RAM。

      您可以通过使用 mmap 创建大型匿名映射 (MAP_PRIVATE | MAP_ANONYMOUS) 来专门强制执行此行为,例如你打算最多持有多少。在现代 x64 系统上,虚拟映射最大可达 64Tb。从逻辑上讲,它是您的程序可用的内存,但实际上页面会在您开始使用时添加到其中。

      realloc 正如其他海报所描述的那样,是调整 malloc 映射大小的天真方法,但要确保 realloc 成功。它可能会失败!

      当您使用一次内存时会出现内存问题,不要释放它并停止使用它。相比之下,已分配但未触及的内存通常不会实际使用 VM 表条目以外的资源。

      【讨论】:

        猜你喜欢
        • 2013-02-21
        • 2016-05-21
        • 2013-12-23
        • 1970-01-01
        • 1970-01-01
        • 2019-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多