C语言,realloc动态内存申请,出现报错double free or corruption (!prev)
答案:3 悬赏:0 手机版
解决时间 2021-11-21 16:38
- 提问者网友:王者佥
- 2021-11-20 23:24
C语言,realloc动态内存申请,出现报错double free or corruption (!prev)
最佳答案
- 五星知识达人网友:等灯
- 2021-11-20 23:30
这个错误信息:double free or corruption (!prev),free了多次或者数据损坏。
看了你的代码没有看到明显的多次释放,但是没有看到你输出结果的部分,我想可能是在那部分访问内存越界了。
有时即使越界一个字节也会被检查到而报这个警告。可以仔细检查一下输出部分的代码,或者用先注释掉输出部分,跑一跑以缩小范围这种方法。
while (counter != height - 1)
//此处赋值越界,估计是修改到了动态内存的信息区,造成释放时候取到不正确的信息从而造成崩溃;
假设tom之后的内存就是matrix[0],matrix[1];
tom越界破坏了matrix[N]的一个或者几个记录内存信息的内存,从而造成后果。
参考资料
CSDN.CSDN[引用时间2018-1-8]
看了你的代码没有看到明显的多次释放,但是没有看到你输出结果的部分,我想可能是在那部分访问内存越界了。
有时即使越界一个字节也会被检查到而报这个警告。可以仔细检查一下输出部分的代码,或者用先注释掉输出部分,跑一跑以缩小范围这种方法。
while (counter != height - 1)
//此处赋值越界,估计是修改到了动态内存的信息区,造成释放时候取到不正确的信息从而造成崩溃;
假设tom之后的内存就是matrix[0],matrix[1];
tom越界破坏了matrix[N]的一个或者几个记录内存信息的内存,从而造成后果。
参考资料
CSDN.CSDN[引用时间2018-1-8]
全部回答
- 1楼网友:北方的南先生
- 2021-11-21 01:36
你仔细看看你程序中动态分配内存这一句是否有问题:
x = MALLOC(N1, double);
PS:指针!追问程序的一开始,有如下定义:
#define MALLOC(num,type) (type*)alloc((num)*sizeof(type))
看着没问题啊追答看你的程序 你是想把 x作为一个数组吧。
然而请你注意,double *x 这个指针虽然可以指向一个数组,但是它实际上只能作为该数组的第一个元素的地址被调用,也就是说,无论你调用这句命令 x = MALLOC(N1, double);给 x 分配多大的内存,他都只能是存储第一个元素的数据,而不能存储多个元素的数据。而 x 之所以可以作为一个数组的地址指针是因为编译器给数组分配的是几段地址连续的内存空间,你知道了第一个元素的地址
只要相应的将地址变量加1既可以得到第二个元素的地址并访问到第二个元素,同理依次加1就可以得到第三,第四,第五,......第n个元素的地址。
所以,你的程序实际上只分配了存放第一个元素的内存空间只是这块空间很大而已,而其他元素根本没有分配到内存。这就是你的问题所在。
x = MALLOC(N1, double);
PS:指针!追问程序的一开始,有如下定义:
#define MALLOC(num,type) (type*)alloc((num)*sizeof(type))
看着没问题啊追答看你的程序 你是想把 x作为一个数组吧。
然而请你注意,double *x 这个指针虽然可以指向一个数组,但是它实际上只能作为该数组的第一个元素的地址被调用,也就是说,无论你调用这句命令 x = MALLOC(N1, double);给 x 分配多大的内存,他都只能是存储第一个元素的数据,而不能存储多个元素的数据。而 x 之所以可以作为一个数组的地址指针是因为编译器给数组分配的是几段地址连续的内存空间,你知道了第一个元素的地址
只要相应的将地址变量加1既可以得到第二个元素的地址并访问到第二个元素,同理依次加1就可以得到第三,第四,第五,......第n个元素的地址。
所以,你的程序实际上只分配了存放第一个元素的内存空间只是这块空间很大而已,而其他元素根本没有分配到内存。这就是你的问题所在。
- 2楼网友:鸠书
- 2021-11-20 23:56
这个错误信息:double free or corruption (!prev),free了多次或者数据损坏
看了你的代码没有看到明显的多次释放,但是没有看到你输出结果的部分,我想可能是在那部分访问内存越界了。
有时即使越界一个字节也会被检查到而报这个警告。可以仔细检查一下输出部分的代码,或者用先注释掉输出部分,跑一跑以缩小范围这种方法。追问你好,注释掉输出后,直接报错 Segmentation fault (core dumped) 加入输出后的程序 见补充问题,求帮助、、、追答count ++;
fprintf(fout, "%12.4f%12.4f\n", x[count], y[count]);
问题就在这种地方了,在count++后你才输出,这样在末端妥妥的会越界了
而且你这样根本就是错开了一个单位,数组偏移0的位置就没输出过。
fprintf(fout, "%12.4f%12.4f\n", x[count], y[count]);
count ++;
这样就不会越界追问我又看了一下 我的原程序,就是先fprintf(fout, "%12.4f%12.4f\n", x[count], y[count]);
才count++; 上面写错了、、、不好意思啊、、还可能是哪里出错呢?追答371行,fclose(fout2);这里多余了
因为你在323行已经关闭过一次了
删掉371行就一切ok
看了你的代码没有看到明显的多次释放,但是没有看到你输出结果的部分,我想可能是在那部分访问内存越界了。
有时即使越界一个字节也会被检查到而报这个警告。可以仔细检查一下输出部分的代码,或者用先注释掉输出部分,跑一跑以缩小范围这种方法。追问你好,注释掉输出后,直接报错 Segmentation fault (core dumped) 加入输出后的程序 见补充问题,求帮助、、、追答count ++;
fprintf(fout, "%12.4f%12.4f\n", x[count], y[count]);
问题就在这种地方了,在count++后你才输出,这样在末端妥妥的会越界了
而且你这样根本就是错开了一个单位,数组偏移0的位置就没输出过。
fprintf(fout, "%12.4f%12.4f\n", x[count], y[count]);
count ++;
这样就不会越界追问我又看了一下 我的原程序,就是先fprintf(fout, "%12.4f%12.4f\n", x[count], y[count]);
才count++; 上面写错了、、、不好意思啊、、还可能是哪里出错呢?追答371行,fclose(fout2);这里多余了
因为你在323行已经关闭过一次了
删掉371行就一切ok
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯