我需要用零填充现有数组的开头。我目前的方法是为数组重新分配额外的内存,将每个值向前移动,然后添加零。
这对于非常大的数组来说非常慢,所以我想知道 C 中是否有一种方法可以为数组的开头重新分配内存?
例如,如果数组 n1=100 的原始大小,并且我想添加 npad=10 个值,有没有办法重新分配数组 [i] 现在指向先前存储在数组 [i-npad 中的值]?
不抱希望,但提前谢谢!
您请求的内容不仅不受标准 C 库支持,而且在理论上是不可能的,除非在初始分配时分配可能需要的空间。例程可能会给您在开头添加空间的realloc
错觉,就像在结尾添加空间的错觉一样,但这需要(可能)移动数据,无论您是自己做还是让被调用的例程做它。
为了比较,realloc
不保证它会在数组末尾分配更多空间。它可能会尝试在数组末尾分配更多空间,但它所保证的是,如果空间可用,它将在更大的空间中提供相同的数据。为此,如果它不能扩大现有分配,它会分配新空间并移动数据。
如果我们试图实现一个在开始时增加分配的例程,我们将在初始分配时面临一个选择:
如果我们选择前者,分配不能在开始时扩大。如果我们选择后者,我们就是在浪费空间,并且必须提前知道需要多少空间。
为什么不喜欢
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;
}