双重免费或损坏(快速顶部)错误

时间:2014-12-04 05:54:58

标签: c

所以我使用可调整大小的数组实现堆,并且每次重新分配内存时我都会收到此错误。问题是realloc ..我只是无法弄清楚它有什么问题。这是插入函数:

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时会出现错误。已经很久了,只是想不出来-_- 提前谢谢!

3 个答案:

答案 0 :(得分:0)

malloc(data.arraySize)

这次以及对mallocrealloc的所有其他来电都是错误的。你想要

malloc(data.arraySize * sizeof(int)) 

或分别

malloc(data.arraySize * sizeof(long)) 

根据您的元素类型。 malloc和朋友接受以字节为单位的分配大小,int s和long s通常大于一个字节。所以你的数组分配太短,你得到缓冲区溢出。

答案 1 :(得分:0)

问题几乎肯定不是realloc,realloc已经在一系列的环境中进行了测试,并且证明是可靠的。检查你的代码是否超过任何其他已分配结构的数组范围..

你应该超过分配的上限。 realloc分配字符但是,你的数组是整数,几乎可以肯定大于字符

尝试以下更改: 。     int * tempOne = realloc(data-> heapElemOne * sieof(int),data-> arraySize);     long * tempTwo = realloc(data-> heapElemTwo,sizeof(long));

答案 2 :(得分:0)

很酷我想出来了。我不知道如何但由于某些原因我为我的线程添加了一个清理函数,当收到sigint时,错误就消失了:/ 我是一个新手,只是为了几天,所以我还没有弄清楚它是如何修复它的: 谢谢你的帮助:) 我最初使用malloc和realloc的方式也是错误的,所以也要感谢:)