- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
以下是我的程序的节选。
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);
}
最佳答案
几个问题:
您需要在 insert
函数中对 pq
进行额外的间接访问 - 如果您使用 realloc
更新值,那pq
的新值不会在调用 insert
的函数中更新。
切勿将 realloc
的结果直接分配给原始指针 - 如果 realloc
失败,它将返回 NULL
,并且您最终会丢失对先前分配的内存的引用,从而导致内存泄漏。将结果分配给临时变量,检查临时变量以确保 realloc
成功,然后更新您的原始指针和大小变量。
如果您打算让 N
成为 *pq
中下一个可用元素的索引,那么您应该更新它作为 N++
,而不是 ++N
。如果您使用 ++N
,则 N
是最后写入的元素 的索引(并且您跳过了元素 0,并且您冒着索引一个元素的风险超过数组中的最后一个元素)。根据 insert
函数的编写方式,您似乎打算让 N
代表 *pq
中的下一个可用元素,因此您应该将其更新为 N++
。
不要强制转换 malloc
/calloc
/realloc
的结果 - 如果您的编译器报错,那么您正在编译此代码作为 C++,而不是 C。如果您打算将此代码编译为作为 C++,那么您不应该在以下位置使用 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 );
关于c - 使用 realloc() 将数组的大小加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46448653/
我正在使用Mapbox开发 map 应用程序。 我正在使用的方法使用Point(Double,Double) 获取类型不匹配要求:两次发现:两次? val lat = location
我想将 System.out 消息写入另一个 OutputStream,但我仍然想要标准输出。 我找到了类似问题的答案Copy and Redirecting System.err Stream :
我正在尝试为我正在处理的排序找到所有处理器的全局最小值和最大值。我正在尝试使用 MPI_Reduceall int rank, nproc; MPI_Comm_size(MPI_COMM_WORLD,
我想知道从一种可空类型转换为另一种“兼容”可空类型的最佳方式(从更安全和简洁的意义上说)是什么。 具体来说,从十进制转换?加倍?可以使用: public double? ConvertToNullab
我的一个表的文件大小(.MYD 文件)增加了大约 100%。如果我查看数据,就会发现过去几天的每日负载正常。是什么导致文件大小增加? myisamchk 根据用户的建议,我尝试了sudo myisam
我有一个 invoices 表。每张发票都有许多 invoice_items 和 transactions(或者,如果您愿意,也可以是“付款”)。对于每张发票,我想计算已支付金额(即其交易金额的总和)
我需要一个尽可能接近 0 的值。我需要能够除以这个值,但实际上它应该为 0。 Java 是否提供了一种简单的方法来生成仅设置最低有效位的 double ?还是必须自己计算? //编辑:一些背景信息,因
由于 Math.random ()(以及大多数伪随机数生成器,AFAIK)在 [0,1) 中生成数字: function randomInRange(min, max) { return Math
这应该很容易。相信我,我已经为此研究了几个小时。我的查询: SELECT not_piece.pid, part.name AS 'Part Name', SUM(qty_left) AS 'In S
我正在尝试传递类型为 vector > 的变量到函数 F(double ** mat, int m, int n) . F 函数来自另一个库,所以我无法更改它。有人可以给我一些提示吗?谢谢。 最佳答案
我正在尝试读取一个文件,读取它包含的字节数,然后将其四舍五入到最接近的 GB,然后将文件大小加倍。但是,有没有办法读取文件,然后将所有这些东西重新放入同一个文件中? 这是我目前所拥有的,但它创建了一个
我正在尝试传递类型为 vector > 的变量到函数 F(double ** mat, int m, int n) . F 函数来自另一个库,所以我无法更改它。有人可以给我一些提示吗?谢谢。 最佳答案
我想对超大 (200+ MB) Sqlite 文件进行一些测试。我有一些相对较小的文件 (10MB),但我想测试更大的文件。 有没有什么快速的方法/工具可以通过复制表中的数据来增加这些 Sqlite
我有一个 64 位数字,写成两个 32 位未签名的整数:unsigned int[2]。 unsigned int[0] 是 MSB,unsigned int[1] 是 LSB。我如何将它转换为 do
我需要将数量的值传递给库进行评估。 boost units library在 SI 中采用双倍值,因此 boost 单位库在确保该要求方面非常有吸引力。但是,我应该如何将数量转换为双倍值?文档和示例似
如何向 ksoap2 请求添加双重属性? request.addProperty("doubleProperty", 1.0); 网络上没有明确的答案。 最佳答案 为了将 double 值作为请求参数
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我正在尝试从 AngularJS 用 Swing 编写的 REST API 生成 .bin 文件。以下是代码。 var options = { url: 'http://example.com/i
我对这段代码中的特定值集有疑问。 double inputs[] = {0, -546543, 99015, 6750, 825, 2725, 70475, 50950, 42200, 675
我在 ruby on rails 应用程序中尝试为密码生成盐时遇到了 SecureRandom#hex 方法。为什么它会加倍长度参数/坚持返回的字符串长度是偶数? 最佳答案 该方法生成一个 n 字
我是一名优秀的程序员,十分优秀!