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

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

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <string.h>
  5.  
  6. #define BUF_LEN 100
  7. #define COUNT 5
  8.  
  9. int main(void)
  10. {
  11. char buf[BUF_LEN];
  12. size_t str_count = ;
  13. size_t capacity = COUNT;
  14. char **pS = calloc(capacity, sizeof(char*));
  15. char **psTemp = NULL;
  16. char *pTemp = NULL;
  17. size_t str_len = ;
  18. bool sorted = false;
  19.  
  20. printf("Enter strings to be sorted, one per line. Press Enter to end:\n");
  21.  
  22. char *ptr = NULL;
  23.  
  24. while(true)
  25. {
  26. ptr = fgets(buf, BUF_LEN, stdin);
  27. if(!ptr)
  28. {
  29. printf("Error reading string.\n");
  30. free(pS);
  31. pS = NULL;
  32. return ;
  33. }
  34.  
  35. if(*ptr == '\n')
  36. break;
  37.  
  38. if(str_count == capacity)
  39. {
  40. capacity += capacity/;
  41.  
  42. if(!(psTemp = realloc(pS, capacity)))
  43. return ;
  44. pS = psTemp;
  45. }
  46.  
  47. str_len = strlen(buf) + ;
  48.  
  49. if(!(pS[str_count] = malloc(str_len)))
  50. return ;
  51. strcpy(pS[str_count++], buf);
  52. }
  53.  
  54. while(!sorted)
  55. {
  56. sorted = true;
  57. size_t i = ;
  58. for(; i < str_count - ; i++)
  59. {
  60. if(strcmp(pS[i], pS[i+]) > )
  61. {
  62. sorted = false;
  63. pTemp = pS[i];
  64. pS[i] = pS[i+];
  65. pS[i + ] = pTemp;
  66. }
  67.  
  68. }
  69. }
  70.  
  71. printf("Your input sorted in ascending sequence is:\n\n");
  72. size_t i = ;
  73. for(; i < str_count; i++)
  74. {
  75. printf("%s", pS[i]);
  76. free(pS[i]);
  77. pS[i] = NULL;
  78. }
  79. free(pS);
  80. pS = NULL;
  81.  
  82. return ;
  83. }

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

  1. *** Error in `./program714.out': realloc(): invalid next size: 0x0000000002365010 ***
  2. ======= Backtrace: =========
  3. /lib64/libc.so.(+0x7f5d4)[0x7f476bff35d4]
  4. /lib64/libc.so.(+0x83bd8)[0x7f476bff7bd8]
  5. /lib64/libc.so.(realloc+0x1d2)[0x7f476bff9832]
  6. ./program714.out[0x4008ea]
  7. /lib64/libc.so.(__libc_start_main+0xf5)[0x7f476bf963d5]
  8. ./program714.out[0x400729]
  9. ======= Memory map: ========
  10. - r-xp fd: /home/wlf/practice/program714.out
  11. - r--p fd: /home/wlf/practice/program714.out
  12. - rw-p fd: /home/wlf/practice/program714.out
  13. - rw-p : [heap]
  14. 7f4764000000-7f4764021000 rw-p :
  15. 7f4764021000-7f4768000000 ---p :
  16. 7f476bd5e000-7f476bd73000 r-xp fd: /usr/lib64/libgcc_s-4.8.-.so.
  17. 7f476bd73000-7f476bf72000 ---p fd: /usr/lib64/libgcc_s-4.8.-.so.
  18. 7f476bf72000-7f476bf73000 r--p fd: /usr/lib64/libgcc_s-4.8.-.so.
  19. 7f476bf73000-7f476bf74000 rw-p fd: /usr/lib64/libgcc_s-4.8.-.so.
  20. 7f476bf74000-7f476c136000 r-xp fd: /usr/lib64/libc-2.17.so
  21. 7f476c136000-7f476c336000 ---p 001c2000 fd: /usr/lib64/libc-2.17.so
  22. 7f476c336000-7f476c33a000 r--p 001c2000 fd: /usr/lib64/libc-2.17.so
  23. 7f476c33a000-7f476c33c000 rw-p 001c6000 fd: /usr/lib64/libc-2.17.so
  24. 7f476c33c000-7f476c341000 rw-p :
  25. 7f476c341000-7f476c363000 r-xp fd: /usr/lib64/ld-2.17.so
  26. 7f476c557000-7f476c55a000 rw-p :
  27. 7f476c55e000-7f476c562000 rw-p :
  28. 7f476c562000-7f476c563000 r--p fd: /usr/lib64/ld-2.17.so
  29. 7f476c563000-7f476c564000 rw-p fd: /usr/lib64/ld-2.17.so
  30. 7f476c564000-7f476c565000 rw-p :
  31. 7ffde3137000-7ffde3158000 rw-p : [stack]
  32. 7ffde31c5000-7ffde31c7000 r-xp : [vdso]
  33. ffffffffff600000-ffffffffff601000 r-xp : [vsyscall]
  34. Aborted

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

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

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

C语言扩展动态内存报错:realloc(): invalid next size: 0x0000000002365010 ***的更多相关文章

  1. blurImage做图片模糊处理报错free(): invalid next size

    $image = new Imagick($url); $image->blurImage($x, $y); 调用blurImage($x, $y)函数报错: 原因是:原来的图片是CMYK的是印 ...

  2. C语言之动态内存管理

    C语言之动态内存管理 大纲: 储存器原理 为什么存在动态内存的开辟 malloc() free() calloc() realloc() 常见错误 例题 柔性数组 零(上).存储器原理 之前我们提到了 ...

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

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

  4. 数据结构基础(1)--数组C语言实现--动态内存分配

    数据结构基础(1)--数组C语言实现--动态内存分配 基本思想:数组是最常用的数据结构,在内存中连续存储,可以静态初始化(int a[2]={1,2}),可以动态初始化 malloc(). 难点就是数 ...

  5. zabbix共享内存报错cannot create semaphore set

    zabbix共享内存报错 cannot open log: cannot create semaphore set: [28] No space left on device 报错原因: kernel ...

  6. Jade报错:Invalid indentation,you can use tabs or spaces but not both问题

    现象:通过html生成jade文件之后,更改jade文件时,语句没什么问题的情况下,jade文件编译不通过,报错:Invalid indentation,you can use tabs or spa ...

  7. mysql创建表时,设置timestamp DEFAULT NULL报错1067 - Invalid default value for 'updated_at'

    问题背景: 线上的linux服务器上的mysql服务器中导出数据库的结构.想要在本地创建一个测试版本 导出后再本地mysql上运行却报错   1067 - Invalid default value ...

  8. 数据库查询语句报错-ORA-00911: invalid character

    数据库查询语句报错-ORA-00911: invalid character 根据自己经验总结下: 1.都是分号惹的祸,有时候sql语句后面有分好导致这种错误 2.还有一种是从别处copy过来的sql ...

  9. CocoaPods pod install的时候报错:invalid byte sequence in UTF-8 (ArgumentError)解决办法

    CocoaPods pod install的时候报错:invalid byte sequence in UTF-8 (ArgumentError)解决办法: 基本可以确定是Podfile中的内容编码有 ...

随机推荐

  1. OC MRC之计数器的基本操作(代码分析)

    /* 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> ...

  2. 深入了解 Java-Netty高性能高并发理解

    https://www.jianshu.com/p/ac7fb5c2640f 一丶 Netty基础入门 Netty是一个高性能.异步事件驱动的NIO框架,它提供了对TCP.UDP和文件传输的支持,作为 ...

  3. 微信小程序中的bindTap事件(微信小程序开发QQ群:604788754)

    bindTap对应的绑定事件, 第一个:wx.navigateTo wx.navigateTo({ url:"../content/content" }) 第二个:wx.redir ...

  4. 使用MyEclipse将HTML5移动项目迁移到PhoneGap(一)

    MyEclipse开年钜惠 在线购买低至75折!立即开抢>> [MyEclipse最新版下载] 一.创建一个新的PhoneGap应用程序项目 PhoneGap应用程序项目的结构与HTML5 ...

  5. spring核心容器

    容器:用来包装或装载物品的储存器 web服务器与jsp.servlet的关系: 从程序文件存放的位置 程序文件要放到web服务器上 从程序执行的方式  程序的从初始化到消亡都是web服务器管理的 从以 ...

  6. C#读取Access数据表中某一列内容,保存至数组

    string strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=product.mdb";OleDbConnecti ...

  7. putc,fputc,和putchar

    putc()功能和fputc()差不多,一个是宏,一个是函数 putc(int ch,FILE *fp),即将字符ch输出到fp所指的文件中:putchar(char ch),即将字符ch输出到标准输 ...

  8. ORACLE常用系统查询

    目录(?)[-] 查询系统所有对象 查看系统所有表 查看所有用户的表 查看当前用户表 查看用户表索引 查看主键 查看唯一性约束 查看外键 查看表的列属性 查看所有表空间 查看oracle最大连接数 修 ...

  9. TX2平台CAN总线收发功能的测试

    前言 项目实现过程中需要将获取的数据信息通过CAN总线传输到控制规划模块,本文主要介绍如何在TX2平台测试CAN总线的收发功能. TX2是英伟达旗下为嵌入式平台人工智能应用开发出的一个硬件平台,TX1 ...

  10. TF-IDF算法(2)—python实现

    参加完数模之后休息了几天,今天继续看TF-IDF算法.上篇中对TF-IDF算法已经做了详细的介绍,在此不再赘述.今天主要是通过python,结合sklearn库实现该算法,并通过k-means算法实现 ...