2014-12-04 118 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的方式也是错误的,所以也谢谢你:)