晚上被这个内存扩展崩溃的问题折腾的有点崩溃,当答案揭晓的那一刻,恍然大悟,原来如此简单。

  练习题目:输入一个字符串,根据字母进行排序,说白了就是一个简单的冒泡

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>#define BUF_LEN 100
#define COUNT 5int main(void)
{char buf[BUF_LEN];size_t str_count = 0;size_t capacity = COUNT;char **pS = calloc(capacity, sizeof(char*));char **psTemp = NULL;char *pTemp = NULL;size_t str_len = 0;bool sorted = false;printf("Enter strings to be sorted, one per line. Press Enter to end:\n");char *ptr = NULL;while(true){ptr = fgets(buf, BUF_LEN, stdin);if(!ptr){printf("Error reading string.\n");free(pS);pS = NULL;return 1;}if(*ptr == '\n')break;if(str_count == capacity){capacity += capacity/4;if(!(psTemp = realloc(pS, capacity)))return 1;pS = psTemp;}str_len = strlen(buf) + 1;if(!(pS[str_count] = malloc(str_len)))return 2;strcpy(pS[str_count++], buf);}while(!sorted){sorted = true;size_t i = 0;for(; i < str_count - 1; i++){if(strcmp(pS[i], pS[i+1]) > 0){sorted = false;pTemp = pS[i];pS[i] = pS[i+1];pS[i + 1] = pTemp;}}}printf("Your input sorted in ascending sequence is:\n\n");size_t i = 0;for(; i < str_count; i++){printf("%s", pS[i]);free(pS[i]);pS[i] = NULL;}free(pS);pS = NULL;return 0;
}

  上面标黄处,首先是通过calloc进行内存分配,初始是capacity的长度是5,接着判断当输入的字符串个数等于5了,那么就动态的扩展内存,继续按25%的速度增长。就是在扩展这里,一直报错:

*** Error in `./program714.out': realloc(): invalid next size: 0x0000000002365010 ***
======= Backtrace: =========
/lib64/libc.so.6(+0x7f5d4)[0x7f476bff35d4]
/lib64/libc.so.6(+0x83bd8)[0x7f476bff7bd8]
/lib64/libc.so.6(realloc+0x1d2)[0x7f476bff9832]
./program714.out[0x4008ea]
/lib64/libc.so.6(__libc_start_main+0xf5)[0x7f476bf963d5]
./program714.out[0x400729]
======= Memory map: ========
00400000-00401000 r-xp 00000000 fd:01 1321539                            /home/wlf/practice/program714.out
00600000-00601000 r--p 00000000 fd:01 1321539                            /home/wlf/practice/program714.out
00601000-00602000 rw-p 00001000 fd:01 1321539                            /home/wlf/practice/program714.out
02365000-02386000 rw-p 00000000 00:00 0                                  [heap]
7f4764000000-7f4764021000 rw-p 00000000 00:00 0
7f4764021000-7f4768000000 ---p 00000000 00:00 0
7f476bd5e000-7f476bd73000 r-xp 00000000 fd:01 655380                     /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f476bd73000-7f476bf72000 ---p 00015000 fd:01 655380                     /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f476bf72000-7f476bf73000 r--p 00014000 fd:01 655380                     /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f476bf73000-7f476bf74000 rw-p 00015000 fd:01 655380                     /usr/lib64/libgcc_s-4.8.5-20150702.so.1
7f476bf74000-7f476c136000 r-xp 00000000 fd:01 658657                     /usr/lib64/libc-2.17.so
7f476c136000-7f476c336000 ---p 001c2000 fd:01 658657                     /usr/lib64/libc-2.17.so
7f476c336000-7f476c33a000 r--p 001c2000 fd:01 658657                     /usr/lib64/libc-2.17.so
7f476c33a000-7f476c33c000 rw-p 001c6000 fd:01 658657                     /usr/lib64/libc-2.17.so
7f476c33c000-7f476c341000 rw-p 00000000 00:00 0
7f476c341000-7f476c363000 r-xp 00000000 fd:01 658372                     /usr/lib64/ld-2.17.so
7f476c557000-7f476c55a000 rw-p 00000000 00:00 0
7f476c55e000-7f476c562000 rw-p 00000000 00:00 0
7f476c562000-7f476c563000 r--p 00021000 fd:01 658372                     /usr/lib64/ld-2.17.so
7f476c563000-7f476c564000 rw-p 00022000 fd:01 658372                     /usr/lib64/ld-2.17.so
7f476c564000-7f476c565000 rw-p 00000000 00:00 0
7ffde3137000-7ffde3158000 rw-p 00000000 00:00 0                          [stack]
7ffde31c5000-7ffde31c7000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted

  代码看来看去发现没毛病,唯一能怀疑的地方就是内存扩展的那一行,经过几番折腾,发现只要一到需要增长调用realloc就报错,最后回去看calloc,只能一拍大腿骂娘了,字节计算的类型不对啊,一个是按char*(相当于二维数组pS[][]中的子数组pS[])来计算字节,一个是按字符(char)来计算字节,得到的内存大小必然不同啊。把realloc的第二个参数加上这个就解决了:  

if(!(psTemp = realloc(pS, capacity*sizeof(char*))))

  编码需谨慎,差之毫厘,谬之千里,一点小小的bug都能让程序崩溃。

C语言扩展动态内存报错:realloc(): invalid next size: 0x0000000002365010 ***相关推荐

  1. 【kafka】kafka 启动报错 InvalidReceiveException: Invalid receive (size = -720899)

    1.概述 kafka启动报错InvalidReceiveException: Invalid receive (size = -720899) 参考文章:https://bbs.csdn.net/to ...

  2. 【C语言】动态内存分配

    [C语言]动态内存分配 文章目录 [C语言]动态内存分配 一.malloc 与free函数 二.calloc 三.realloc 四.常见的动态内存的错误 本期,我们将讲解malloc.calloc. ...

  3. 【C语言】动态内存开辟

    目录 一.动态内存开辟的原因 二.动态内存开辟函数 1.malloc函数 2.free函数 3.calloc 4.realloc 总结 三.C/C++内存开辟 四.柔性数组 1.柔性数组定义 2.柔性 ...

  4. C语言中动态内存分配的本质是什么?

    摘要:C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态分配. 本文分享自华为云社区<[云驻共创]C语言中动态内存分配的本质>,作者: G ...

  5. C语言知识点 -- 动态内存管理、文件操作

    C语言知识点 – 动态内存管理.文件操作 文章目录 C语言知识点 -- 动态内存管理.文件操作 一.动态内存管理 1.malloc 2.free 3.calloc 4.realloc 二.文件操作 1 ...

  6. C语言中几种报错类型的解决方案

    C语言中几种报错类型的解决方案 声明:本人小白,第一次写博客,由于查报错原因比较困难,为了方便记下自己敲代码遇到的问题而随笔写下,文中有诸多错误,希望路过的大佬能够对我的文章批评指正.我也会不断修改完 ...

  7. R语言-处理异常值或报错的三个示例

    R语言-处理异常值或报错的三个示例 参考文章: (1)R语言-处理异常值或报错的三个示例 (2)https://www.cnblogs.com/awishfullyway/p/6611690.html ...

  8. ionic4 背景设置动态图片报错WARNING: sanitizing unsafe style value background-image:url

    ionic4 背景设置动态图片报错WARNING: sanitizing unsafe style value background-image:url WARNING: sanitizing uns ...

  9. c语言malloc引用类型作参数,c语言中动态内存分配malloc只在堆中分配一片内存.doc...

    c语言中动态内存分配malloc只在堆中分配一片内存 .C语言中动态内存分配(malloc)只在堆中分配一片内存,返回一个void指针(分配失败则返回0),并没有创建一个对象.使用时需要强制转换成恰当 ...

最新文章

  1. Spring Cloud Zuul中使用Swagger汇总API接口文档
  2. Matplotlib-动态更新图表
  3. LaTeX输入单个点、横向多个点、竖向多个点、斜向多个点
  4. 模拟教务评教(强智教务)—一件评教实现原理
  5. 从Q3财报看百度营销成长
  6. 查看winpe系统的语言版本
  7. 用户和计算机的交互通常通过,2008年广东省农村信用社考试计算机真题及答案解析(16)...
  8. Linux学习笔记033_8文本处理
  9. DAG的深度优先搜索标记
  10. 解决Maven的Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart
  11. Windows 新漏洞可被用于强制服务器以攻击者身份认证,官方缓解措施已发布
  12. 2015-11-30 20:59:08之自力更生
  13. 用R语言做单方程的误差修正模型(ECM)
  14. 图像处理--轮廓介绍及特征
  15. 想搬去苏州生活了。。
  16. 【答读者问5】如何实现以当天收盘价交易?
  17. 龙迅LT7911D Type-C/DP/eDP to MIPI DSI/CSI/LVDS 信号转换芯片
  18. 【Vuforia】最佳实践:支持作为模型目标(Model Targets)的对象和CAD模型
  19. Handler 源码解析——Handler的创建
  20. jsp报错500解决办法

热门文章

  1. AST实战|ob混淆一键还原开源啦,免安装babel库
  2. MapReduce-WordCount实现按照value降序排序、字符小写、识别不同标点
  3. Spring MCV基于注解的控制器
  4. 股票软件开发技术之个股的选择功能设计思路101
  5. 【活动报名】11Space :和大牛一起聊聊“微信小程序”!
  6. requests模块proxies代理IP设置无效问题的解决
  7. 华为防火墙做单臂路由_【原创】华为网络设备单臂路由配置实验
  8. C++ 实现康拓展开(leetcode 60)
  9. unity手机旋转状态-加速计
  10. Java基础(集合框架——Collection、List、Set、泛型)