C realloc(): invalid next size错误
C realloc(): invalid next size
问题代码
#include <stdio.h>
#include <stdlib.h>
int *getNumber();
void printfList(int const* list);
int main(){
int *list = getNumber();
printfList(list);
free(list);
return 0;
}
int *getNumber(){
int *list = (int *)calloc(1, sizeof(int));
int count = 0;
*list = count;
int num = 0;
while (scanf("%d", &num) == 1){
list[0] = ++count;
list = realloc(list, sizeof(int) * count);
list[count] = num;
}
return list;
}
void printfList(int const* list){
int count = *list++;
for (int i=0;i < count;i++)
printf("%d,", *list++);
printf("\n");
}
这个代码大致的工作是从stdin中读取数字,并且写入到数组中,其中数组的第一个元素记录的是读取数字的个数。
出现有问题的代码位于此处:list = realloc(list, sizeof(int) * count);
问题分析
在经过一番折腾之后,关于出现list = realloc(list, sizeof(int) * count);错误的原因我在网上大致了解了,主要有如下:
- 计算长度的方式不对,比如:
char *tmp = calloc(1, sizeof(char);
// 经过一系列操作
tmp = realloc(tmp, sizeof(char *)*10);
两次计算长度使用的sizeof中的类型不同,虽然这不一定是代码错误,但通常他不是我们想要的结果。
- 越界读取,这通常不仅会导致
realloc有问题,还可能会导致free等操作有问题。
我还看到过另外一个原因,就是realloc申请的内存比原来的内存小。我没有求证过这个错误,但据我所知,realloc不仅可以扩大内存,还可以缩小内存的。
解决问题
我的问题非常奇怪,因为在我输入大约6个数字的时候,调用realloc是没有问题的,但是多于6个数字就会出现问题了。
最后仔细检查代码,发现list = realloc(list, sizeof(int) * count);中,count指的不是数组的长度,而是读取数字的个数。因为数组的首位保存的是数字读取的个数,所以数组的总长度应该是读取数字的个数并且加一。
我把代码换成list = realloc(list, sizeof(int) * (count + 1));就成功执行了。
看来,我的问题是属于上面问题分析中的第二种问题。
至于为什么在输入小于6个数字的时候没有报错,估计是因为我虽然越界读取,但没有破坏到其他资源,所以没有出错吧。
C realloc(): invalid next size错误的更多相关文章
- C语言扩展动态内存报错:realloc(): invalid next size: 0x0000000002365010 ***
晚上被这个内存扩展崩溃的问题折腾的有点崩溃,当答案揭晓的那一刻,恍然大悟,原来如此简单. 练习题目:输入一个字符串,根据字母进行排序,说白了就是一个简单的冒泡 #include <stdio.h ...
- C 语言 *** glibc detected *** free(): invalid next size (fast): 0x0000000000be1010 ***
. . . . . LZ 今天在写一个 Socket 程序的时候使用 malloc(3) 在堆上动态分配了一个结构体的空间,在使用完之后用 free(3) 函数释放空间的时候报 invalid nex ...
- realloc 使用详解(分析realloc invalid pointer、指针无效等错误)【转】
来源:http://www.cnblogs.com/ladd/archive/2012/06/30/2571420.htmlrealloc函数用来为ptr重新分配大小为size的一块内存,看似很简单, ...
- R语言 启动报错 *** glibc detected *** /usr/lib64/R/bin/exec/R: free(): invalid next size (fast): 0x000000000263a420 *** 错误 解决方案
*** glibc detected *** /usr/lib64/R/bin/exec/R: free(): invalid next size (fast): 0x000000000263a420 ...
- Error : Invalid Allocation Size :·····Bytes 以及 abort() has been called
把这两个Error放在一起,主要是因为在写代码的时候发现,他们有公共的错误. (一)Invalid Allocation Size 主要是因为new分配内存出了问题,从直观翻译来看,应该是内存分配长度 ...
- Solve Error: "errcode": 40016, "errmsg": "invalid button size hint"
在使用微信官方给的添加自定义菜单的示例代码: { "button": [ { "name": "扫码", "sub_button& ...
- C/C++动态分配连续空间,下标越界导致的free():invalid next size问题
昨天帮导师做的一个程序出了内存泄露的bug(在VS上程序运行一切正常,等return返回后才出错) 而且是程序运行结束后才出现的错误,在退出前一切代码都顺利执行完了,只是return之后出错. 之后我 ...
- 【free() invalid next size】谨慎地在C++的类中存储指针来方便访问其他节点
“我跟你们说,你们知道STL容器,vector/string/deque等等,都有个reserve方法吗?你们一个个地push_back,嫌C++比C慢,怪谁?” “要像我这样,预先分配足够大的空间, ...
- 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]
前段时间开发的一个后端C模块上线后,线上出core,初始时,因为訪问压力不大,所以崩溃是上线3天左右出现的.当时用gdb跟进调用堆栈并检查源代码,发现出core位置的代码沒有啥问题.因为当时开发任务较 ...
- ** Error in `./g2o_viewer': realloc(): invalid pointer:
问题: defe@defe-Precision-Tower-3620:~/project/Demo/UseG2OforPoseGraph/useg2oforposegraph$ ./g2o_viewe ...
随机推荐
- Solution -「九省联考 2018」劈配
Description Link. 一年一度的综艺节目<中国新代码>又开始了.Zayid 从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. 轻车熟路的 Za ...
- 真·Redis缓存优化—97%的优化率你见过嘛?
本文通过一封618前的R2M(公司内部缓存组件,可以认为等同于Redis)告警,由浅入深的分析了该告警的直接原因与根本原因,并根据原因提出相应的解决方法,希望能够给大家在排查类似问题时提供相应的思路. ...
- 实战指南,SpringBoot + Mybatis 如何对接多数据源
本文分享自华为云社区 <实战指南,SpringBoot + Mybatis 如何对接多数据源>,作者:战斧. 在我们开发一些具有综合功能的项目时,往往会碰到一种情况,需要同时连接多个数据库 ...
- Django-rest-framework框架——Xadmin的使用、Book系列多表群操作、RBAC-基于角色的访问控制
@ 目录 一 过滤Filtering 二 排序 三 分页Pagination 可选分页器 应用 四 异常处理 Exceptions 4.1 使用方式 4.2 案例 4.3 REST framework ...
- Python面向对象——Mixin机制、重载、多态与鸭子类型、绑定与非绑定方法、Python常见的内置函数
文章目录 内容回顾 Mixin机制 1.什么是Mixin 2.Mixin来源 3.定义及优点 4.在python中的应用 5.在Django项目中的应用 重载(在子类派生的新方法中如何重用父类的功能) ...
- ESP32
Main menu Search Create account Log in Personal tools Apply for a scholarship & submit you ...
- 再学Blazor——概述
简介 Blazor 是一种 .NET 前端 Web 框架,同时支持服务器端呈现和客户端交互性. 使用 C# 语言创建丰富的交互式 UI 共享前后端应用逻辑 可以生成混合桌面和移动应用 受益于 .NET ...
- 16.1 Socket 端口扫描技术
端口扫描是一种网络安全测试技术,该技术可用于确定对端主机中开放的服务,从而在渗透中实现信息搜集,其主要原理是通过发送一系列的网络请求来探测特定主机上开放的TCP/IP端口.具体来说,端口扫描程序将从指 ...
- 8.12 dp模拟赛总结
考场概况: 开考发现题目竟然不保证按难度顺序排序QAQ 正序开题, \(T1\) 显然是数位 \(dp\) 然而没学过不会写,顺手打了 \(30pts\) 暴力走人. \(T2\) 期望 \(dp\) ...
- pta乙级1033(C语言)散列表解法
#include"stdio.h" #include"string.h" int main() { int flag=1; char w[100010],ch[ ...