以下是我的节目的摘录。
void insert(int *pq,int key){
if(MS==N){
pq=(int*)realloc(pq,sizeof(int)*MS*2);
MS*=2;
}
pq[++N]=INT_MIN;
increase_key(pq,N,key);
}
int* priority_queue(){
int *heap=(int*)malloc(sizeof(int)*10);
MS=10;
return heap;
}
在插入函数中重新分配内存时,我收到此错误。我希望在完全填充数组时将其大小加倍。
(gdb) n
46 pq=(int*)realloc(pq,sizeof(int)*MS*2);
(gdb) n
*** Error in `/home/akhileshydv/Documents/Cprog/a.out': realloc(): invalid next size: 0x0000000000602010 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7ffff7a847e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x834aa)[0x7ffff7a904aa]
/lib/x86_64-linux-gnu/libc.so.6(+0x85ba9)[0x7ffff7a92ba9]
/lib/x86_64-linux-gnu/libc.so.6(realloc+0x22f)[0x7ffff7a918ef]
/home/akhileshydv/Documents/Cprog/a.out[0x4007d5]
/home/akhileshydv/Documents/Cprog/a.out[0x4005e8]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7ffff7a2d830]
/home/akhileshydv/Documents/Cprog/a.out[0x4004e9]
======= Memory map: ========
00400000-00401000 r-xp 00000000 08:09 3414051 /home/akhileshydv/Documents/Cprog/a.out
00600000-00601000 r--p 00000000 08:09 3414051 /home/akhileshydv/Documents/Cprog/a.out
00601000-00602000 rw-p 00001000 08:09 3414051 /home/akhileshydv/Documents/Cprog/a.out
00602000-00623000 rw-p 00000000 00:00 0 [heap]
7ffff0000000-7ffff0021000 rw-p 00000000 00:00 0
7ffff0021000-7ffff4000000 ---p 00000000 00:00 0
7ffff77f7000-7ffff780d000 r-xp 00000000 08:09 3936807 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff780d000-7ffff7a0c000 ---p 00016000 08:09 3936807 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff7a0c000-7ffff7a0d000 rw-p 00015000 08:09 3936807 /lib/x86_64-linux-gnu/libgcc_s.so.1
7ffff7a0d000-7ffff7bcd000 r-xp 00000000 08:09 3938830 /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7bcd000-7ffff7dcd000 ---p 001c0000 08:09 3938830 /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7dcd000-7ffff7dd1000 r--p 001c0000 08:09 3938830 /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7dd1000-7ffff7dd3000 rw-p 001c4000 08:09 3938830 /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7dd3000-7ffff7dd7000 rw-p 00000000 00:00 0
7ffff7dd7000-7ffff7dfd000 r-xp 00000000 08:09 3938808 /lib/x86_64-linux-gnu/ld-2.23.so
7ffff7fdb000-7ffff7fde000 rw-p 00000000 00:00 0
7ffff7ff5000-7ffff7ff8000 rw-p 00000000 00:00 0
7ffff7ff8000-7ffff7ffa000 r--p 00000000 00:00 0 [vvar]
7ffff7ffa000-7ffff7ffc000 r-xp 00000000 00:00 0 [vdso]
7ffff7ffc000-7ffff7ffd000 r--p 00025000 08:09 3938808 /lib/x86_64-linux-gnu/ld-2.23.so
7ffff7ffd000-7ffff7ffe000 rw-p 00026000 08:09 3938808 /lib/x86_64-linux-gnu/ld-2.23.so
7ffff7ffe000-7ffff7fff000 rw-p 00000000 00:00 0
7ffffffde000-7ffffffff000 rw-p 00000000 00:00 0 [stack]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
Program received signal SIGABRT, Aborted.
0x00007ffff7a42428 in __GI_raise (sig=sig@entry=6)
at ../sysdeps/unix/sysv/linux/raise.c:54
54 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
为什么我收到此错误?请提出任何解决方案。
编辑:我已经制作了我的' pq'注释部分建议的变量全局,但问题仍然存在。void priority_queue(){
pq=malloc(sizeof(int)*10);
MS=10;
}
void insert(int key){
if(MS==N){
pq=realloc(pq,sizeof(int)*MS*2);
MS*=2;
}
pq[++N]=INT_MIN;
increase_key(N,key);
}
答案 0 :(得分:3)
几个问题:
pq
函数中的insert
需要额外的间接级别 - 如果您使用realloc
更新值,则pq
的新值将获胜不要在调用insert
的函数中更新。
永远不要将realloc
的结果直接分配给原始指针 - 如果realloc
失败,它将返回NULL
,您将最终丢失对{}的引用以前分配的内存,导致内存泄漏。将结果分配给临时,检查临时以确保realloc
成功,然后更新原始指针和大小变量。
如果您希望N
成为*pq
中下一个可用元素的索引,那么您应该将其更新为N++
,不是++N
。如果您使用++N
,那么N
是最后写入元素的索引(并且您跳过元素0,并且您冒险索引一个超过数组中的最后一个元素) 。根据{{1}}函数的编写方式,您希望insert
代表N
中的下一个可用元素,因此您应将其更新为*pq
。
不要转换N++
/ malloc
/ calloc
的结果 - 如果您的编译器抱怨,那么您将此代码编译为C ++ ,而不是C.如果您打算将此代码编译为作为C ++ ,那么您根本不应该使用realloc
,而是使用malloc
或某些vector
其他标准容器。如果您打算将此代码编译为为C ,则会丢失malloc
和realloc
上的强制转换,并仔细检查您的编译器设置。
把这一切放在一起:
void insert(int **pq, int key){
if(MS == N) {
int *tmp = realloc(*pq, sizeof **pq * MS * 2); // sizeof **pq == sizeof (int)
if (tmp)
{
*pq = tmp;
MS *= 2;
}
else
{
// realloc failed, original buffer is still intact. Handle
// as appropriate.
}
}
(*pq)[N++] = INT_MIN; // parens are required here
increase_key(*pq, N, key); // assuming increase_key does not need to modify pq
}
你称之为:
int *q = malloc( sizeof *q * INITIAL_NUMBER_OF_ELEMENTS );
...
insert( &q, keyval );
答案 1 :(得分:0)
如果N以-1开头,那么你应该尝试:
forecast(X, h=200)
但我同意从0开始会更好。