我需要用零填充现有数组的开头。我当前的方法是为数组重新分配额外的内存,向前移动每个值,然后添加零。
这对于非常大的数组来说非常慢,所以我想知道C中是否有一个方法可以为数组的开头重新分配内存?
例如,如果数组的原始大小n1 = 100,并且我想添加npad = 10个值,是否有办法重新分配,以便数组[i]现在指向先前存储在数组中的值[ I-NPAD]
没有希望,但提前谢谢!
答案 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;
}