realloc函_[转载]realloc函数的使用及注意事项(转)

原型:extern

void *realloc(void *mem_address, unsigned int newsize);

用法:#include

功能:改变mem_address所指内存区域的大小为newsize长度。

说明:如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。

下面再看MSDN中对realloc()函数的描述:

realloc returns a void pointer to the reallocated (and possibly

moved) memory block. The return value is NULL if the size is zero

and the buffer argument is not NULL, or if there is not enough

available memory to expand the block to the given size. In the

first case, the original block is freed. In the second, the

original block is unchanged. The return value points to a storage

space that is guaranteed to be suitably aligned for storage of any

type of object. To get a pointer to a type other than void, use a

type cast on the return value.

这段E文基本上是在讲realloc()的返回值的。realloc()函数的返回值是void *型的。有下面三种情况:

1、返回void * 指针,调用成功。Void

*型的指针指向新分配的内存空间。在需要的情况下可以再对这个指针进行强制类型转换,转换成你需要的类型的指针。如果传入的第一个指针参数为NULL,则该函数等同与malloc函数。

2、返回NULL,当需要扩展的大小(第二个参数)为0并且第一个参数不为NULL,此时原内存被“freed”掉了。

我们知道,realloc是从堆上分配内存的,当扩大一块内存空间时,

realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平;可如果数据后面的字节不够的话,那么就使用堆上第一个有足够大小的自由块,现存的数据然后就被拷贝至新的位置,而老块则放回到堆上。返回值指向新分配的内存地址。

由于在这其中可能会发生数据的移动,因此我们应该尽力避免下面的用法。

…………………………

#include

char *p,*q;

p = (char * ) malloc (10);

q=p;

p = (char * ) realloc (p,20);

…………………………

在这种情况下,如果发生了数据的移动,p指向了新分配的内存地址,但是指针q还依然指向原先的内存地址,而原先的那部分内存已经在realloc函数中free掉了,因此指针q成了“野指针”,指向了一块未知的内存区域,这是很危险的。类似的,我们也应该尽量避免下面这种情况的使用。

…………………………

q = (char * ) realloc (p,20);

………………………

与第一种情况类似,如果发生了数据的移动,q指向了新分配的内存地址,而指针p还依然指向原先的内存地址,此时p成了野指针。如果不得以非得这样使用的话(估计这种情况是不存在的),我们也应该紧跟此后将指针p置为NULL。

…………………………

q = (char * ) realloc (p,20);

p = NULL;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

InfluxDB 2.0 之Flux语法篇

由于项目 IoTSharp 需要支持 InfluxDB , 因此进行了初步尝试, 虽然 Flux 语法初次学习, 但查询语句却似曾相识, 如果改一下 标点符号, 你会完全认为他是 C#的拉姆达表达式, 首先看一下写入数据:using (var…

spring的钩子_spring提供的钩子,你知道哪些

俗话说得好“工欲善其事必先利其器”,现如今springboot与springcloud已成为快速构建web应用的利器。作为一个爪洼工程师,知道如下的spring扩展点,可能会让你编写出扩展性、维护性更高的代码。spring提供的钩子,你知道哪些bean的生…

.Net 5性能改进

起因在.Net Core跳过4.0,避免和先.Net Framework 4.0同名,版本号变为5.0,同时也不在叫.Net Core改为.Net 5(统一的叫法),先看看官方对.Net版本规划.本文主要是根据https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/ 翻译而来.不完全翻译.顺序也有所调…

ffmpeg库编译加文字_1.编译ffmpeg库

1.下载ffmpeg#!/bin/bashsource"ffmpeg-4.1"if [ ! -r $source ]thencurl http://ffmpeg.org/releases/${source}.tar.bz2 | tar xj || exit 1ficurl 表示下载,后边跟下载的地址。tar表示解压或者压缩。 x表示解压,j表示是否需要解压bz2压缩包…

C#中形态各异的class

本篇是基本知识,老码农请无视!!!普通静态抽象密封分部修饰关键字无staticabstractsealedpartial构造函数调用时机实例化(new)时内部任意静态成员调用时子类实例化(new)时实例化(new)时实例化(new)时包含成员字段属性方法事件索引器…

mysql 笛卡尔积_Mysql内连接、左连接会出现笛卡尔积的理解

先简单解释一下笛卡尔积。 现在,我们有两个集合A和B。 A = {0,1} B = {2,3,4} 集合 AB 和 BA的结果集就可以分别表示为以下这种形式: AB = {(0,2),(1,2),(0,3),(1,3),(0,4),(1,4)}; BA = {(2,0),(2,1),(3,0),(3,1),(4,0),(4,1)}; 以上AB和BA的结…

开放数字世界中的复杂图数据挑战 —— 以教育与开源场景为例

摘要:开源开放的数字世界开始成为时代的潮流,云原生、数据中台、智能PRA开始成为数字世界中的新一代中流砥柱。随着第四范式的普遍流行,各个行业中的数字化转型都会带了海量的具有无限关联的复杂图数据。本报告将以教育与开源两个场景为例&am…

mysql anyvalue函数_Mysql 的ANY_VALUE()函数和 ONLY_FULL_GROUP_BY 模式

Mysql 的ANY_VALUE()函数和 ONLY_FULL_GROUP_BY 模式1、ONLY_FULL_GROUP_BY 引发在mysql 5.7版本以上进行一些ORDER BY 或者 GROUP BY 时,会出现如下错误[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated colu…

在IIS中部署SPA应用,多么痛的领悟!

目前公司的Web项目是SPA应用,采用前后端分离开发,所以有时也会倒腾Vue框架。“前后端应用最终以容器形态、在k8s中部署, 为此我搭建了基于Gitlab flow的Devops流程。在Devops实践中,容器部署成为良方和事实标准。但是在开发和自测阶段&#x…

mysql闪回工具下载_MySQL闪回工具之myflash 和 binlog2sql

实践利用binlog2sql查询两个binlog之间的SQL:必须是两个binlog日志,指定start-file和stop-filebinlog2sql -h127.0.0.1 -P3309 -udba -pxxxxxx -dsakila -t employee --start-filemysql-bin.000112 --stop-filemysql-bin.000113 > /tmp/db.sql利用bin…

MySQL大表优化方案

背景阿里云RDS FOR MySQL(MySQL5.7版本)数据库业务表每月新增数据量超过千万,随着数据量持续增加,我们业务出现大表慢查询,在业务高峰期主业务表的慢查询需要几十秒严重影响业务方案概述一、数据库设计及索引优化MySQL数据库本身高度灵活,造成…

使用Azure静态Web应用部署Blazor Webassembly应用

上一次演示了如何使用Azure静态web应用部署VUE前端项目(使用Azure静态web应用全自动部署VUE站点)。我们知道静态web应用支持VUE,react,angular等项目的部署。除了支持这些常见前端框架,静态web应用同样支持微软推出的最…

mysql无法创建新用户_如何mysql禁止创建新用户

展开全部使用户不具有e69da5e6ba9062616964757a686964616f31333337376264Create User权限或者deny Create User权限下面是权限列表mysql> show privileges \G*************************** 1. row ***************************Privilege: AlterContext: TablesComment: To al…

TIOBE 11 月榜单:Python 挤掉 Java,Java的下跌趋势确立了?

喜欢就关注我们吧!TIOBE 公布了 2020 年 11 月的编程语言排行榜。Python 已成功跃居榜单第二名,本月排名率为 12.12%;Java 被挤到第三位,排名率降至 11.68%。自有 TIOBE 榜单以来,C 和 Java 之前一直占据着前两名的位置…

mysql mysqladmin 介绍_Mysql—mysqladmin 命令详解

mysqladmin是一个执行管理操作的客户端程序。它可以用来检查服务器的配置和当前状态、创建和删除数据库等。mysqladmin工具的使用格式:mysqladmin [option] command [command option] command ......1.查看mysql的安装目录,进入mysql命令行输入&#xff…

一路踩坑,被迫聊聊 C# 代码调试技巧和远程调试

一:背景 1. 讲故事每次项目预交付的时候,总会遇到各种奇葩的坑,我觉得有必要梳理一下以及如何快速解决的,让后来人避避坑,这篇就聊聊自己的所闻所遇:我去,本地环境代码跑的哧溜,上了…

mysql decimal型转化为float_5分钟搞懂MySQL数据类型之数值型DECIMAL类型

速成指南5分钟搞懂MySQL数据类型之数值型--DECIMAL类型DECIMAL类型的语法:DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]。其中M指定的是数字的总位数(精度,最大65,默认值10),D指定的是小数点后数字的位数(最大30,并且不能大…

mysql 变量 数据类型_浅谈mysql(二)数据类型

//我。。。我才是不是傲娇呢//如有问题还请多多指教。上回我们说到我们如何使用MySQL,关键是要看它的用途。用途衍生语句。之后文章的思路,也是如此,从用途出发,然后再到语句。那么,我们先问几个问题,我们用…

Java面试必问JVM调优,那.NET5呢?

JVM调优已经是普通Java工程师的必修课了,而.NET开源快5年了,CLR层面的优化到目前都不多见,甚至常用的性能调优工具都还没玩过。.NET5马上来了,要想在互联网大潮中逆袭,光靠平台是不够的,开发者也得给力才行…

win10新建管理员账户_【经验篇001】Win10专业版如何开启超级管理员账户

关注我们前言介绍我们在使用Win10系统的时候,有时候安装一些特殊的专业类软件,需要系统赋予软件特殊的权限,那就需要使用超级管理员帐户,Win10系统安装时候,Administrator账户默认是禁用的,所以我们就需要开…