realloc 报错invaild next size

记录一个realloc 函数 报 invaild next size 问题。
问题伪代码

uint32_t mlen= 1392;
uint8_t *message = malloc(mlen);
...
mlen = mlen + 1392;
calloc(message, mlen);
mlen = mlen + 1392;
calloc(message, mlen);

重新分配内存的时候,需要的内存大小还是相对比较大的。mlen经过几次增加,最大会达到4000+。当程序执行到calloc改行时候,报错invaild next size.

realloc 函数分析

realloc 函数原型如下,ptr为要重新分配内存的地址,size为要重新分配内存的大小。要注意的是,该函数的返回值是指向新内存的指针。

void* realloc (void* ptr, size_t size);

realloc 函数重新分配内存的时候,存在一下两种情况(扩大内存的情况):

  1. ptr指针后续仍有足够空间分配size大小的内存
    此时,realloc函数会在ptr的尾部开辟size大小的内存。
  2. ptr指针后续没有足够空间分配size大小的内存
    此时,realloc函数会在其它内存位置分配一个size大小的内存空间,并将原有大小的数据复制到新地址。此时新空间的地址发生了变化。

问题解决

当分析玩realloc函数原理,大体的问题原因已经可以猜测到了,空间位置发生了变化。
解决办法

uint32_t mlen= 1392;
uint8_t *message = malloc(mlen);
...
mlen = mlen + 1392;
message = calloc(message, mlen);
mlen = mlen + 1392;
message = calloc(message, mlen);

每次都用返回值作为ptr的新地址,保证不会出问题。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程...
    小辰带你看世界阅读 3,751评论 0 1
  • 进程线程ID相关 PID:每个线程都有自己的PID,唯一TID:同一进程下的线程编号,同一进程中唯一,跨进程不唯一...
    秃头小陈阅读 1,436评论 0 0
  • 这个LAB 是上完CMU CSAPP的16-20 LECTURE之后,就可以做了。csapp 课程观看地址:htt...
    西部小笼包阅读 20,076评论 2 9
  • # 前言 ### 为什么我要尝试写作技术书籍 - 一个人年轻时经历的艰难会在未来成为他的财富 # 第一篇 基础和应...
    zhzosh阅读 3,764评论 0 0
  • C语言中内存分配 在任何程序设计环境及语言中,内存管理都十分重要。在目前的计算机系统或嵌入式系统中,内存资源仍然是...
    一生信仰阅读 4,973评论 0 2

友情链接更多精彩内容