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

关于realloc的行为方式,结合源码总结为:
1. realloc失败的时候,返回NULL;

2. realloc失败的时候,原来的内存不改变,也就是不free或不move,(这个地方很容易出错);

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

4. 如果size为0,效果等同于free();

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

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


#include <stdio.h>
#include <stdlib.h> int main()
{
char* p1 = 1;
char* p2 = 1;
char* p3 = 1;
char* p4 = 1;
char* p5 = 1; p1 = (char*)malloc(10);
printf("1: p1 = %x\n", p1); p2 = (char*)malloc(0);
printf("2: p2 = %x\n", p2); p3 = (char*)malloc(10);
printf("3: p3 = %x\n", p3); p4 = realloc(p1, 20);
if(p4 != 0){
printf("4: p4 = %x\n", p4);
printf("4: p1 = %x\n", p1);
}else{
printf("4 f: p4 = %x\n", p4);
printf("4 f: p1 = %x\n", p1);
} p5 = realloc(p3, 0);
if(1){
printf("5: p5 = %x\n", p5);
printf("5: p3 = %x\n", p3);
} return 0;
}
/* 1: p1 = 20a00
2: p2 = 21008
3: p3 = 20a18
4: p4 = 21410
4: p1 = 20a00
5: p5 = 21018
5: p3 = 20a18 分析:
void *malloc(size_t size);
void *realloc(void *ptr, size_t size); 1. malloc(0)成功后,返回一个非0的地址值; 2.realloc(ptr,size)成功后,返回新的地址值;ptr会被free,但这个地址值不会改变。
因此,如果使用p2 = realloc(ptr, size2)的形式,在realloc成功后,应该手动使ptr = 0,避免野指针; 如果使用ptr = realloc(ptr, size2),则不需处理。 3.realloc失败后,ptr不受影响,不会被free。 */

  

参考:

1. Linux Programmer's Manual   http://www.man7.org/linux/man-pages/man3/malloc.3.html
2. 关于realloc的调整内存方式 http://blog.csdn.net/dadoneo/article/details/8688593

C语言,realloc的更多相关文章

  1. C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。

    在C语言操作中会用到大量的内存操作,当中非经常常使用的一个是realloc(). 由字面意思能够知道,该函数的作用是用于又一次分配内存. 使用方式例如以下: NewPtr=(数据类型*)realloc ...

  2. C语言realloc,malloc,calloc的区别【转载】

    转载自:http://www.cnblogs.com/BlueTzar/articles/1136549.html 三个函数的申明分别是: void* realloc(void* ptr, unsig ...

  3. [WIP]C语言 realloc的坑

    创建: 2019/01/07 题外话,不知不觉又一年过去了,2019也要好好努力. 回到主题,在用动态循环数组实现queue的时候, 由于realloc的原因出现了一些莫名其妙的错误. 先开个题,晚点 ...

  4. realloc的使用误区

    C语言 realloc() 函数位于 stdlib.h 头文件中,原型为: void *realloc(void *ptr, size_t size); realloc() 会将 ptr 所指向的内存 ...

  5. 【C/C++开发】malloc,calloc和realloc的区别和注意事项

    (1)C语言跟内存分配方式 <1>从静态存储区域分配.        内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量. <2&g ...

  6. Redis核心原理与实践--字符串实现原理

    Redis是一个键值对数据库(key-value DB),下面是一个简单的Redis的命令: > SET msg "hello wolrd" 该命令将键"msg&q ...

  7. c语言中的内存分配malloc、alloca、calloc、malloc、free、realloc、sbr

    C语言跟内存分配方式 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2) 在栈上创建.在执行函数时,函数内局部变 ...

  8. C语言中动态内存的分配(malloc,realloc)

    动态内存分配:根据需要随时开辟,随时释放的内存分配方式.分配时机和释放时机完全由程序员决定,由于没有数据声明,这部分空间没有名字.无法像使用变量或数组那样通过变量名或数组名引用其中的数据,只能通过指针 ...

  9. C语言 malloc calloc realloc alloc 在分配内存时的 区别

    malloc : 向堆申请分配内存,不初始化 calloc  : 向堆申请分配内存,初始化为0 realloc:  向堆申请分配内存,可调整大小 alloc   :   向栈申请内存,不需手动释放

  10. C语言 malloc、calloc、realloc的区别

    三个函数的申明分别是: void* malloc(unsigned size); void* realloc(void* ptr, unsigned newsize); void* calloc(si ...

随机推荐

  1. 【转载】Java重构示例【1】

    序言 本文通过Java示例代码片段展示了常用重构原则和技巧,供初级开发人员参考.精致的代码能够清楚传达作者的意图,精致的代码是最好的注释,精致的代码非常容易维护和扩展.程序员阅读精致的代码如同大众欣赏 ...

  2. Linux下通过rm -f删除大量文件时提示"-bash: /bin/rm: Argument list too long"的解决方法

    Linux下通过rm -f删除/var/spool/postfix/maildrop/中大量的小文件时提示: "-bash: /bin/rm: Argument list too long& ...

  3. Python 模块(五)

    目录 模块介绍 time &datetime模块 random json & picle 一.模块介绍 在我们日常的程序开发过程中,随着代码越写越多,在单个文件里的代码就会越来越长,越 ...

  4. USACO Healthy Holsteins DFS

    使用排列组合,遍历所有可能的情况C(1)+C(2)+C(3)……C(n)= 2^G种组合 数据规模不大,暴力过去最多也就是2^15 = 23768种情况 所以就暴力咯,不过还是Debug了一会 Sou ...

  5. 基于visual Studio2013解决C语言竞赛题之0502最小数替换

         题目

  6. [Andriod官方API指南]连接之蓝牙

    Bluetooth —— 蓝牙 The Android platform includes support for the Bluetooth network stack, which allows ...

  7. 利用httpclient和多线程刷訪问量代码

    缘起于玩唱吧,由于唱吧好友少,訪问量低,又不想加什么亲友团之类的,主要是太麻烦了,于是我就琢磨唱吧的訪问机制,准备用java的httpclient库来进行刷訪问量,想到动态IP反复使用就想到了用多线程 ...

  8. iOS开发中xib和Storyboard中需要注意的事项

    使用xib注意事项: 1.只有自带view的控件才可以使用xib,因为它本身就是一个view 2.在使用可视化控件添加属性(代码)时候,如果删除了属性代码,一定要在xib上解除关联(不然会崩溃) 3. ...

  9. 高级UIKit-09(TCPSocket发送文件、上传和下载)

    [day1101_SocketSendFile]:发送文件到服务端 发送文件需要在该文件上拼接消息头,比如类型,文件名,文件大小 // 服务端 - (void)viewDidLoad { [super ...

  10. Windows8下通过IPv4地址访问Tomcat

    最近在做Android开发,手机客户端需要通过IPv4地址访问电脑启动的Web应用服务. 在Windows 7不需要做什么设置,localhost,127.0.0.1或者192.168.0.100都可 ...