`
蒙面考拉
  • 浏览: 160246 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Realloc的使用

 
阅读更多

realloc 用过很多次了。无非就是将已经存在的一块内存扩大。

char* p = malloc(1024);
char* q = realloc(p,2048);

现在的问题是我们应该如何处理指针 p。 刚开始按照我最直观的理解,如果就是直接将 p = NULL;。 到最后只需要释放 q的空间就可以了。

因为最近在做个封装。结果在做单元测试的时候发现。有时候我在 free(q); 的时候会出错。这样我就郁闷了。

后来仔细一跟踪,发现 realloc 完以后 q 和 p 的指针地址是一样。不过有时候又不一样。

仔细查了下资料。得到如下信息:

       1.如果 当前连续内存块足够 realloc 的话,只是将p所指向的空间扩大,并返回p的指针地址。 这个时候 q 和 p 指向的地址是一样的。

       2.如果 当前连续内存块不够长度,再找一个足够长的地方,分配一块新的内存,q,并将 p指向的内容 copy到 q,返回 q。并将p所指向的内存空间删除。

这样也就是说 realloc 有时候会产生一个新的内存地址 有的时候不会。所以在分配完成后。我们需要判断下 p 是否等于 q。并做相应的处理。

这里有点要注意的是要避免 p = realloc(p,2048); 这种写法。有可能会造成 realloc 分配失败后,p原先所指向的内存地址丢失。

以下来自百度:

1. realloc失败的时候,返回NULL

  2. realloc失败的时候,原来的内存不改变,不会释放也不会移动

  3. 假如原来的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址

  4. 如果size为0,效果等同于free()。这里需要注意的是只对指针本身进行释放,例如对二维指针**a,对a调用realloc时只会释放一维,使用时谨防内存泄露。

  5. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的

  6.传递给realloc的指针可以为空,等同于malloc。

分享到:
评论

相关推荐

    realloc函数的使用

    realloc函数的使用在数据结构中十分重要,本文给出了使用的例子和使用的具体说明

    数据结构顺序表 C语言代码实现以及realloc的使用

    本文将深入探讨如何使用C语言实现顺序表,并重点讲解`realloc`函数在扩展内存时的作用。 首先,我们需要理解顺序表的基本操作,包括创建、插入、删除和查找。在C语言中,我们可以使用结构体来表示顺序表,例如定义...

    linux软件工程师(c语言)

    4. **malloc, calloc和realloc使用小结**: 这些是C语言中的动态内存管理函数: - `malloc`用于分配指定大小的内存块,返回的指针可以直接使用。 - `calloc`分配连续的内存空间,并初始化为零,适合创建数组。 -...

    realloc函数使用总结

    realloc原型是extern void *realloc(void *mem...  #include <stdlib> 有些编译器需要#include ,在TC2.0中可以使用alloc.h头文件  功能  先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地

    mm.zip_Free!_realloc

    `malloc`、`free`和`realloc`是C标准库中的关键函数,用于动态内存分配和释放。本篇文章将深入探讨这些函数的工作原理、用法以及如何在`mm.zip_Free!_realloc`这个项目中实现它们。 首先,我们来看`malloc()`函数。...

    1.操作系统实验3_2_内存管理之rt_realloc和rt_free1

    在实验中,通过rt_malloc分配内存,然后用rt_realloc尝试扩大内存,最后使用rt_free释放内存,展示了rt_realloc的工作流程。 实验中使用了RT-Thread官方的Realtouch开发板,该板子包含串口3,作为rt_kprintf的输出...

    C语言函数realloc.doc-综合文档

    2. 在使用realloc函数时,需要注意原始内存中的数据保持不变,当内存不再使用时,应使用free()函数将内存块释放。 3. realloc函数与malloc、calloc、free、_alloca函数相似,但realloc函数可以重新分配内存块的大小...

    realloc_test

    本话题主要聚焦于"realloc_test",这是一个与C语言内存管理相关的示例或测试项目,特别是关于`realloc()`函数的使用。`realloc()`是C语言标准库中的一个函数,用于调整已分配内存区域的大小。它在程序开发中扮演着...

    内存分配——realloc()函数的使用

    内存分配——realloc()函数的使用 在C语言中,realloc()函数是一个非常重要的内存分配函数,它可以将已经分配的内存空间重新分配到一个新的大小。然而,在使用realloc()函数时,需要注意一些隐患,以免造成...

    c语言中malloc、realloc与calloc 的区别以及联系

    需要注意,如果内存区域被移动,原指针可能不再有效,因此应使用realloc返回的新指针。 4. **realloc的特殊情况**: - 如果realloc的`ptr`参数为NULL,它会像malloc一样分配`new_size`字节的内存。 - realloc的...

    realloc问题.vsdx

    就是配套我一篇博客讲解的资源,因为我截图可能不是特别清楚,所以我就将这个图上传上来了。是采用Visio画的。

    malloc,realloc,calloc的总结.xlsx

    个人总结各类博客和资料里关于malloc,calloc,realloc的对比

    c代码-c语言realloc函数

    在本文中,我们将深入探讨`realloc()`函数的工作原理、使用方法以及一些最佳实践。 `realloc()`函数的原型如下: ```c void* realloc(void* ptr, size_t size); ``` 其中,`ptr`参数是指向已分配内存的指针,`size`...

    C语言函数realloc.rar-综合文档

    下面将详细介绍`realloc()`函数的使用、语法、工作原理以及相关的注意事项。 ### `realloc()`函数简介 `realloc()`函数在`<stdlib.h>`头文件中定义,其基本语法如下: ```c void* realloc(void* ptr, size_t size...

Global site tag (gtag.js) - Google Analytics