2012-07-28 64 views
0
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,程序崩潰並說:這可能是由於堆的腐敗 爲什麼?

+1

你能向我們展示更多的周邊代碼嗎?這條線沒什麼問題。 – Mysticial 2012-07-28 20:21:29

+1

@Mysticial'ptr = realloc(ptr,N);'總是錯的,儘管這裏可能不是問題。一個*最小*但完整的例子,顯示該問題將是非常有用的,但。 – Flexo 2012-07-28 20:22:53

+1

@Flexo:如果後面跟着if(!ptr)abort();'或類似的東西並不錯,但是,這通常是錯誤的。 – 2012-07-28 20:23:44

回答

7

這不是您發佈的代碼的問題,這是其他地方的問題。

會發生什麼事是程序腐敗堆,然後realloc檢測到堆已損壞。

你將要檢測的腐敗如下:

  1. 確保您啓用調試符號

  2. 通過Valgrind的運行程序

編輯:有您添加的代碼中存在嚴重錯誤。

void VectorAppend(vector *v, const void *elemAddr) 
{ 
    void *target = (char *) v->elems + v->logicLen * v->elemSize; 

    if (v->logicLen == v->allocLen) { 
     v->allocLen *= 2; 
     // Once you call 'realloc', the value of 'elems' might change 
     // This means that 'target' is now INVALID 
     // 'target' is based on the old value of 'elems' 
     v->elems = realloc(v->elems,v->allocLen*v->elemSize); 
     assert(v->elems != NULL); 
    } 
    memcpy(target, elemAddr, v->elemSize); 
    v->logicLen++; 
} 

爲了解決這個問題,移動計算target重新分配如下:

void VectorAppend(vector *v, const void *elemAddr) 
{ 
    if (v->logicLen == v->allocLen) { 
     v->allocLen *= 2; 
     v->elems = realloc(v->elems,v->allocLen*v->elemSize); 
     assert(v->elems != NULL); 
    } 
    void *target = (char *) v->elems + v->logicLen * v->elemSize; 
    memcpy(target, elemAddr, v->elemSize); 
    v->logicLen++; 
} 

另一個錯誤:沒有在您的評論的錯誤,這是代碼的一部分,我想建議嚴肅對待評論。

VectorNew(&aVector, sizeof(long), 4); // allocate 4*4 bytes 

註釋不該說的話,「分配4 * 4」字節,因爲這是誤導性的:有一天你會編譯一個64位的系統,該系統無法在Windows上的程序,這將是4,4個字節。您最好刪除評論並閱讀代碼。

+0

WOW.Thanks!這樣一個愚蠢的錯誤:) – mabeiyi 2012-07-28 20:48:52

相關問題