一、基本特性

1、 realloc()函数可以重用或扩展以前用malloc()、calloc()及realloc()函数自身分配的内存。

2、 realloc()函数需两个参数:一个是包含地址的指针(该地址由之前的malloc()、calloc()或realloc()函数返回),另一个是要新分配的内存字节数。

3、 realloc()函数分配第二个参数指定的内存量,并把第一个参数指针指向的之前分配的内容复制到新配的内存中,且复制的内容长度等于新旧内存区域中较小的那一个。即新内存大于原内存,则原内存所有内容复制到新内存,如果新内存小于原内存,只复制长度等于新内存空间的内容。

4、realloc()函数的第一个参数若为空指针,相当于分配第二个参数指定的新内存空间,此时等价于malloc()、calloc()或realloc()函数。

5、如果是将分配的内存扩大,则有以下3种情况:
        如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。 
        如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
        如果申请失败,将返回NULL,此时,原来的指针仍然有效。

二、注意事项

1、第一个参数要么是空指针,要么是指向以前分配的内存。如果不指向以前分配的内存或指向已释放的内存,结果就是不确定的。

2、 如果调用成功,不管当前内存段后面的空闲空间是否满足要求,都会释放掉原来的指针,重新返回一个指针,虽然返回的指针有可能和原来的指针一样,即不能再次释放掉原来的指针。

今天就在释放原指针(即realloc()函数的第一个参数)这个地方犯了一个错误。下面是测试程序。测试程序的功能非常简单:实现在一个按升序排序的数组中查找x应插入的位置,将x插入数组中,使数组元素仍按升序排列。

 #include<stdio.h>
#include<stdlib.h>
int main()
{
int n = ;
int i = ;
int index = ;
int insert_data = ;
int *pNumber = NULL;
int *pNewArray = NULL;
printf("Input array size:\n");
scanf("%d", &n);
pNumber = (int*)calloc(n, sizeof(int));
if(pNumber == NULL)
{
printf("Not enough memory\n");
exit();
}
//输入插入前已按升序排序的数组元素提示信息
printf("Input array:\n");
for(i = ; i < n; i++)
{
scanf("%d", pNumber+i);
}
//输入待插入的元素x提示信息:
printf("Input x:\n");
scanf("%d", &insert_data);
//确定待插入位置的索引值
for(i = ; i < n; i++)
{
if(insert_data < *(pNumber+i))
{
index = i;
break;
}
}
//用realloc()新分配一块内存,用于存储原数组和新插入的值
pNewArray = (int*)realloc(pNumber, (n+)*sizeof(int));
if(pNewArray == NULL)
{
printf("Not enough memory\n");
exit();
}
//free(pNumber);
//输出新分配的内存空间的值,查看是否实现了复制
for(i = ; i < n+; i++)
{
printf("%4d", pNewArray[i]);
}
printf("\n");
//待插入位置及后面的所有数据依次向后移1位
for(i = n; i > index; i--)
{
*(pNewArray+i) = pNewArray[i-];
}
*(pNewArray + index) = insert_data;
printf("After insert %d:\n", insert_data);
for(i = ; i < n+; i++)
{
printf("%4d", *(pNewArray+i));
}
free(pNewArray);
return ;
}

注意代码44行出,如果注释掉,则结果正确。如果不注释掉则错误。说明上面所述的注意事项中的第2条是正确的。下面是测试用例及结果。

左侧图片为注释掉代码44行的正确结果,右侧图片为未注释掉44行代码的错误结果。

之前一直觉得这个地方没有什么,没想到今天写程序时候在这个地方掉坑里面了。越是这种不注意的小地方越容易犯错。引以为戒。

c语言中realloc()函数解析的更多相关文章

  1. c语言中的c语言中realloc()函数解析

    c语言中realloc()函数解析 真是有点惭愧,这些内容本应该很早就掌握的,以前只是糊里糊涂的用,不知道在内存中具体是怎么回事,现在才弄清楚. realloc(void *__ptr, size_t ...

  2. C语言中qsort函数用法

    C语言中qsort函数用法-示例分析    本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...

  3. C语言中system()函数的用法总结(转)

    system()函数功能强大,很多人用却对它的原理知之甚少先看linux版system函数的源码: #include <sys/types.h> #include <sys/wait ...

  4. 使用C语言中qsort()函数对浮点型数组无法成功排序的问题

    一 写在开头 1.1 本节内容 本节主要内容是有关C语言中qsort()函数的探讨. 二 问题和相应解决方法 qsort()是C标准库中的一个通用的排序函数.它既能对整型数据进行排序也能对浮点型数据进 ...

  5. C语言中malloc函数返回值是否需要类型强制转换问题

    1. 在C语言中, 如果调用的函数没有函数原型, 则其返回值将默认为 int 型. 考虑调用malloc函数时忘记了 #include <stdlib.h>的情况 此时malloc函数返回 ...

  6. R语言中apply函数

    前言 刚开始接触R语言时,会听到各种的R语言使用技巧,其中最重要的一条就是不要用循环,效率特别低,要用向量计算代替循环计算. 那么,这是为什么呢?原因在于R的循环操作for和while,都是基于R语言 ...

  7. (转)C语言中Exit函数的使用

    C语言中Exit函数的使用 exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如 ...

  8. C语言中malloc函数的理解

    在C语言中malloc函数主要是用在堆内存的申请上,使用malloc函数时,函数会返回一个void *类型的值,这个值就是你申请的堆内存的首地址:为什么返回的地址是一个void *类型的地址呢?首先我 ...

  9. 关于C语言中printf函数“输出歧视”的问题

    目录 关于C语言中printf函数"输出歧视"的问题 问题描述 探索问题原因 另一种研究方法 问题结论 关于C语言中printf函数"输出歧视"的问题 问题描述 ...

随机推荐

  1. (四十九)Quartz2D自定义控件

    利用Quartz2D来自定义UIImageView: 模仿UIImageView: 设置frame,设置图片. 注意一个细节,自定义的imageView,应该通过重写set方法来设置图片并且重绘,否则 ...

  2. 《java入门第一季》之StringBuffer小案例

    这里是针对其反转功能来举的例子,再对比之前写的一篇String类的反转功能,StringBuffer明显提高了代码量,提高了效率. import java.util.Scanner; /* * 把字符 ...

  3. myeclipse 彻底让烦人的各种验证消失 让你的开发速度飞快

    大家都知道,myeclipse的验证很吭爹,不但保存的时候要难,BUILD的时候也要验.常常为了等它而浪费了大浪的时间!!真不知道设计人员当初是怎么加进这种功能的.真心不需要. 以前都是到window ...

  4. Ubuntu14.04安装Matlab2013a

    source url: http://blog.sina.com.cn/s/blog_ec5021d60102v3ky.html 1. 为方便操作,把Matlab镜像文件(iso)重命名为'Matla ...

  5. 开源框架VTMagic的使用介绍

    VTMagic 有很多开发者曾尝试模仿写出类似网易.腾讯等应用的菜单分页组件,但遍观其设计,大多都比较粗糙,不利于后续维护和扩展.琢磨良久,最终决定开源这个耗时近两年打磨而成的框架,以便大家可以快速实 ...

  6. centOS 安装(光安装 和 u盘安装)

    光盘安装用这个: http://www.williamlong.info/archives/1912.html 是否保留win7,要作好相关配置.有些插件可以不装. 网络设置:不好弄 如果用u盘安装, ...

  7. Git与远程reposiory的相关命令

    问题1:Git如何同步远程repository的分支(branch) 某天,小C同学问我,为啥VV.git仓库里面本来已经删除了branchA这个分支,但是我的mirror中还是有这个分支呢? 分析: ...

  8. windows linux—unix 跨平台通信集成控制系统

    首先,我们可以用到这个开源的开发包: mdk(Micro-Development-Kit)微量级软件开发包,提供几个常用类,主要实现了一个高性能的并发服务器引擎 使用c++开发,是一个跨平台的开发包, ...

  9. 【Android 应用开发】BluetoothDevice详解

    一. BluetoothDevice简介 1. 继承关系 public static Class BluetoothDevice extends Object implement Parcelable ...

  10. AndroidStudio加快Gradle速度的方法-android study之旅(103)

    方法1 打开setting,搜索compiler ,按照如图配置,不要问我为什么,宝宝心里苦~ 方法2 到开项目的根目录的gradle.properties ,把下面的注释解除 org.gradle. ...