2

我需要用零填充现有数组的开头。我目前的方法是为数组重新分配额外的内存,将每个值向前移动,然后添加零。

这对于非常大的数组来说非常慢,所以我想知道 C 中是否有一种方法可以为数组的开头重新分配内存?

例如,如果数组 n1=100 的原始大小,并且我想添加 npad=10 个值,有没有办法重新分配数组 [i] 现在指向先前存储在数组 [i-npad 中的值]?

不抱希望,但提前谢谢!

4

2 回答 2

3

您请求的内容不仅不受标准 C 库支持,而且在理论上是不可能的,除非在初始分配时分配可能需要的空间。例程可能会给您在开头添加空间的realloc错觉,就像在结尾添加空间的错觉一样,但这需要(可能)移动数据,无论您是自己做还是让被调用的例程做它。

为了比较,realloc不保证它会在数组末尾分配更多空间。它可能会尝试在数组末尾分配更多空间,但它所保证的是,如果空间可用,它将在更大的空间中提供相同的数据。为此,如果它不能扩大现有分配,它会分配新空间并移动数据

如果我们试图实现一个在开始时增加分配的例程,我们将在初始分配时面临一个选择:

  • 分配任何可用空间。在这种情况下,该空间可能就在其他分配的空间之后。
  • 分配空间,并在其之前填充未使用的空间。

如果我们选择前者,分配不能在开始时扩大。如果我们选择后者,我们就是在浪费空间,并且必须提前知道需要多少空间。

于 2013-10-06T11:11:11.750 回答
0

为什么不喜欢

char *GrowArrayAtEnd(char *pOldArray, int nOldSize, int nNewSize)
{   char *pNewArray = (char *)realloc(pOldArray, nNewSize);
    memmove(&pNewArray[nNewSize - nOldSize], pNewArray, nOldSize);
    memset(pNewArray, 0, nNewSize - nOldSize); // if necessary
    return pNewArray;
}
于 2013-10-06T16:18:31.597 回答