所以我使用可调整大小的数组实现堆,并且每次重新分配内存时我都会收到此错误。问题是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时会出现错误。已经很久了,只是想不出来-_- 提前谢谢!
答案 0 :(得分:0)
malloc(data.arraySize)
这次以及对malloc
和realloc
的所有其他来电都是错误的。你想要
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的方式也是错误的,所以也要感谢:)