有没有办法为数组重新分配内存以允许在开头添加其他值?

时间:2013-10-06 10:50:01

标签: c arrays padding realloc

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

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

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

没有希望,但提前谢谢!

2 个答案:

答案 0 :(得分:3)

您要求的内容不仅不受标准C库的支持,而且在理论上是不可能的,除非在初始分配时分配可能需要的空间。一个例程可以给你一种幻觉,即在realloc给出添加空间到最后的幻觉的方式添加空间,但这需要(可能)移动数据,无论你是自己做还是让被调用的例程去做。

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

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

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

如果我们选择前者,分配就不能在开头扩大。如果我们选择后者,我们就会浪费空间,必须事先知道需要多少空间。

答案 1 :(得分: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;
}