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

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

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h> #define BUF_LEN 100
#define COUNT 5 int main(void)
{
char buf[BUF_LEN];
size_t str_count = ;
size_t capacity = COUNT;
char **pS = calloc(capacity, sizeof(char*));
char **psTemp = NULL;
char *pTemp = NULL;
size_t str_len = ;
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 ;
} if(*ptr == '\n')
break; if(str_count == capacity)
{
capacity += capacity/; if(!(psTemp = realloc(pS, capacity)))
return ;
pS = psTemp;
} str_len = strlen(buf) + ; if(!(pS[str_count] = malloc(str_len)))
return ;
strcpy(pS[str_count++], buf);
} while(!sorted)
{
sorted = true;
size_t i = ;
for(; i < str_count - ; i++)
{
if(strcmp(pS[i], pS[i+]) > )
{
sorted = false;
pTemp = pS[i];
pS[i] = pS[i+];
pS[i + ] = pTemp;
} }
} printf("Your input sorted in ascending sequence is:\n\n");
size_t i = ;
for(; i < str_count; i++)
{
printf("%s", pS[i]);
free(pS[i]);
pS[i] = NULL;
}
free(pS);
pS = NULL; return ;
}

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

*** Error in `./program714.out': realloc(): invalid next size: 0x0000000002365010 ***
======= Backtrace: =========
/lib64/libc.so.(+0x7f5d4)[0x7f476bff35d4]
/lib64/libc.so.(+0x83bd8)[0x7f476bff7bd8]
/lib64/libc.so.(realloc+0x1d2)[0x7f476bff9832]
./program714.out[0x4008ea]
/lib64/libc.so.(__libc_start_main+0xf5)[0x7f476bf963d5]
./program714.out[0x400729]
======= Memory map: ========
- r-xp fd: /home/wlf/practice/program714.out
- r--p fd: /home/wlf/practice/program714.out
- rw-p fd: /home/wlf/practice/program714.out
- rw-p : [heap]
7f4764000000-7f4764021000 rw-p :
7f4764021000-7f4768000000 ---p :
7f476bd5e000-7f476bd73000 r-xp fd: /usr/lib64/libgcc_s-4.8.-.so.
7f476bd73000-7f476bf72000 ---p fd: /usr/lib64/libgcc_s-4.8.-.so.
7f476bf72000-7f476bf73000 r--p fd: /usr/lib64/libgcc_s-4.8.-.so.
7f476bf73000-7f476bf74000 rw-p fd: /usr/lib64/libgcc_s-4.8.-.so.
7f476bf74000-7f476c136000 r-xp fd: /usr/lib64/libc-2.17.so
7f476c136000-7f476c336000 ---p 001c2000 fd: /usr/lib64/libc-2.17.so
7f476c336000-7f476c33a000 r--p 001c2000 fd: /usr/lib64/libc-2.17.so
7f476c33a000-7f476c33c000 rw-p 001c6000 fd: /usr/lib64/libc-2.17.so
7f476c33c000-7f476c341000 rw-p :
7f476c341000-7f476c363000 r-xp fd: /usr/lib64/ld-2.17.so
7f476c557000-7f476c55a000 rw-p :
7f476c55e000-7f476c562000 rw-p :
7f476c562000-7f476c563000 r--p fd: /usr/lib64/ld-2.17.so
7f476c563000-7f476c564000 rw-p fd: /usr/lib64/ld-2.17.so
7f476c564000-7f476c565000 rw-p :
7ffde3137000-7ffde3158000 rw-p : [stack]
7ffde31c5000-7ffde31c7000 r-xp : [vdso]
ffffffffff600000-ffffffffff601000 r-xp : [vsyscall]
Aborted

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

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. sql server中的大数据的批量操作(批量插入,批量删除)

    首先我们建立一个测试用员工表 ---创建一个测试的员工表--- create table Employee( EmployeeNo int primary key, --员工编号 EmployeeNa ...

  2. javaScript 变量提升 var let const,以及JS 的解析阶段和执行阶段

    我们先来看一道面试题,大家猜想一下,下面这段代码,打印出来的结果是什么 var name = 'World!'; (function () { if (typeof name === 'undefin ...

  3. UVALive 4174

    DES:给出一个字符串.连续空格的个数代表一个新的字符.奇数个表示0.偶数个表示1.然后根据这个码作为ASCII码.写出对应的字符.就是统计空格个数.二进制转换成十进制的小模拟.但是比赛的时候敲得很不 ...

  4. 《Python》内置方法进阶和常用模块

    一:__new__ 在__init__之前,实例化对象的第一步是__new__创建了一个空间 class Foo: def __init__(self): # 初始化方法 print('执行了init ...

  5. >CH07-cubemap

    使用rendermonkey进行一个天空球的贴图,内容来自<<shaders for gpa>> 不知道是不是用的182版RM的原因,照着书上做一个天空球的CUBEMAP,老不 ...

  6. MS14-021: Internet Explorer 安全更新: 2014 年 5 月 1 日

    微软推送全平台IE零日漏洞补丁 2014.05.2 3 Comments 207 views今天,微软正式发布IE安全补丁,修复4月底曝光的零日漏洞.用户可通过Windows Update自动更新服务 ...

  7. android机顶盒真机调试方法

    最近接触电视APP开发,之前对Android开发也不太了解还一直以为不能真机调试.最近静下心来想一想肯定能真机调试的,我是我不知道而已.现在讲述一下真机调试的步骤: 1.进入设置--关于,连续点击版本 ...

  8. Code Sign error: Provisioning profile XXXX can't be found

    [iphone]Code Sign error: Provisioning profile XXXX can't be found 如果你更新了profile,再编译iphone项目,发现下面的错误, ...

  9. 揭秘Keras推荐系统如何建立模型、获取用户爱好

    你是否有过这样的经历?当你在亚马逊商城浏览一些书籍,或者购买过一些书籍后,你的偏好就会被系统学到,系统会基于一些假设为你推荐相关书目.为什么系统会知道,在这背后又藏着哪些秘密呢? 荐系统可以从百万甚至 ...

  10. OC基础知识总结 分类: ios学习 OC 2015-06-26 17:58 58人阅读 评论(0) 收藏

    //OC: Objective-C, 面向对象的C语言 //OC与C的区别 //1.OC是C的超集, C语言的所有语法都可以在OC中使用 //2.OC是面向对象 //3.OC是一门运行时语言 //4. ...