typedef struct {
void *elems;//address of the memory block
int elemSize; //
int logicLen;//number of existing elements in vector
int allocLen;//allocated space for the vector
} vector;
static void InsertNumbers(vector *numbers, long n, long d)
{
long k;
long residue;
for (k = 0; k < d; k++) {
residue = (long) (((long long)k * (long long) n) % d);
VectorAppend(numbers, &residue);
}
}
void VectorAppend(vector *v, const void *elemAddr)
{
void *target=(char*)v->elems + (v->logicLen * v->elemSize);
if(v->logicLen==v->allocLen){
v->allocLen*=2;
v->elems=realloc(v->elems,v->allocLen*v->elemSize);
assert(v->elems!=NULL);
}
memcpy(target,elemAddr,v->elemSize);
v->logicLen++;
}
然後,我用下面的語句來調用InsertNumbers()當尺寸大於8192字節時,爲什麼realloc()不起作用?
vector aVector;
VectorNew(&aVector, sizeof(long),4);
long first=139269,second=3021377;
InsertNumbers(&aVector,first , second);
好像3021377太大... 在v->elems=realloc(v->elems,v->allocLen*v->elemSize);
我發現,當V-> allocLen = 4096,程序崩潰並說:這可能是由於堆的腐敗 爲什麼?
你能向我們展示更多的周邊代碼嗎?這條線沒什麼問題。 – Mysticial 2012-07-28 20:21:29
@Mysticial'ptr = realloc(ptr,N);'總是錯的,儘管這裏可能不是問題。一個*最小*但完整的例子,顯示該問題將是非常有用的,但。 – Flexo 2012-07-28 20:22:53
@Flexo:如果後面跟着if(!ptr)abort();'或類似的東西並不錯,但是,這通常是錯誤的。 – 2012-07-28 20:23:44