2014-12-04 56 views
0

所以我正在實現一個使用可調整大小的數組的堆,並且每次重新分配內存時都會收到此錯誤。問題是與realloc ..我只是無法弄清楚它有什麼問題。這裏是插入功能:雙免費或腐敗(fasttop)錯誤

void* insert (data_t *data, int room, long wake) { 
if(data->size+1 == data->arraySize){ 
    data->arraySize *= 2; 
    long l = (long)data->arraySize; 
    int* tempOne = realloc(data->heapElemOne, data->arraySize*sizeof(int)); 

    long* tempTwo = realloc(data->heapElemTwo, l*sizeof(long)); 

    if (tempOne != NULL &&tempTwo !=NULL){ //realloc was 
     data->heapElemOne = tempOne; 
     data->heapElemTwo = tempTwo; 
    } 
    else{ //there was an error 
     printf("Error allocating memory!\n"); 
     free(data->heapElemOne); 
     free(data->heapElemTwo); 
     return; 
    } 

    } 
    data->size++; 
    int now = data->size; 

    /*Adjust its position*/ 
    if(data->size >0){ 

    while(data->heapElemTwo[now/2] > wake && ((now/2)!=0)) 
    { 
      data->heapElemTwo[now] = data->heapElemTwo[now/2]; 
      data->heapElemOne[now] = data->heapElemOne[now/2]; 
      now /= 2; 
    } 
    } 

    data->heapElemTwo[now] = wake; 
    data->heapElemOne[now] = room;` 

,這裏是主要的部分:

int main(int argc, char *argv[]){ 
    pthread_t r, c; 
    data_t data; 
    data.arraySize = 2; 
    data.size = 0; 
    long l = (long)data.arraySize; 
    data.heapElemOne = malloc(data.arraySize * sizeof(int)); 
    data.heapElemTwo = malloc(l * sizeof(long)); 

這裏的data_t聲明:

typedef struct{ 
    int arraySize; 
    int* heapElemOne; 
    long* heapElemTwo; 
    int size; 
    int number; 
    pthread_mutex_t mutex; 
    pthread_cond_t more; 
}data_t; 

它搬遷內存4,但是當它正在改變它到8它給出了一個錯誤。在它已經很長時間了,只是無法想象它-_- 在此先感謝!

+0

http://stackoverflow.com/幫助/ mcve – 2014-12-04 06:09:02

+0

無法弄清楚你實際需要什麼。 – Gopi 2014-12-04 06:09:31

+0

是否可以在每次調用'malloc()'和'realloc()'的時候,根據類型的大小,乘以'sizeof(int)'或'sizeof(long)'分配的元素數量你存儲的數據? – ua2b 2014-12-04 06:11:51

回答

0
malloc(data.arraySize) 

這和所有其他調用mallocrealloc是錯誤的。您可以根據元素類型要

malloc(data.arraySize * sizeof(int)) 
分別

,或者,

malloc(data.arraySize * sizeof(long)) 

malloc和朋友接受分配大小以字節爲單位,int s和long s通常大於一個字節。所以你的數組被分配得太短了,你會得到緩衝區溢出。

+0

你是說因爲我給它的大小2它不工作?已經添加* sizeof(int)和很久以前,仍然不起作用:/ – scl 2014-12-04 06:57:28

+0

請不要做獵槍編程。 'malloc(data.arraySize)'是錯的,爲了以防萬一,嘗試它沒有意義。請使用正確的'malloc'和朋友調用來更新你的代碼。如果問題依然存在,請發佈一個MCVE,而不是這裏的代碼片段,以及另一個片段。 – 2014-12-04 07:03:00

+0

謝謝,當我添加一個清理函數時,我確實得到了它的工作......不知道如何:/但不要認爲它會用我的malloc和realloc的方式工作,所以謝謝! :) – scl 2014-12-04 17:23:45

0

這個問題幾乎可以肯定與realloc不同,realloc已經在一個widgets範圍內進行了測試,並且已經證明是可靠的。請檢查您的代碼是否超出任何其他已分配結構的數組邊界。

您很可能超出了您的分配上限。 realloc分配字符,但是,您的數組是整數幾乎肯定大於字符

嘗試這些更改: 。 int * tempOne = realloc(data-> heapElemOne * sieof(int),data-> arraySize); long * tempTwo = realloc(data-> heapElemTwo,sizeof(long));

+0

我以爲我可能一直在使用realloc錯誤或什麼的。我試過這些變化,沒有工作:( – scl 2014-12-04 07:15:16

0

這很酷我找到了。我不知道如何,但由於某種原因,當我添加一個清理函數爲我的線程時收到sigint錯誤消失:/ 我是一個新手,因爲它只是在它幾天,所以我有沒有一個線索如何清理修復它:/ 感謝您的幫助,雖然:) 我最初使用malloc和realloc的方式也是錯誤的,所以也謝謝你:)

相關問題