为什么必须分配一个指针才能使 realloc 工作而不改变内存块中的第一个值?

2023-12-12

int *ptr;
...
realloc(ptr,++count*sizeof(int));
      or
ptr=realloc(ptr,++count*sizeof(int));

我注意到如果我多次使用选项号一,第一个内存地址的值(ptr指向),变为未定义(尽管内存块中的所有其他值都很好并且可以通过下标访问ptr).

但是,我假设所有 realloc 所做的都是缩小或增加内存块的大小,并且ptr仍会指向同一个内存块,并且它的任何值都不会改变。因此,如果我使用选项一,为什么内存块中的第一个地址最终会得到一个意外的值,因为没有ptr仍然指向同一个地址?

EDIT:我确实记得给 ptr 分配内存,只是不认为它有用。


返回的指针realloc 可以不可以指向与传递给它的指针相同的地址。

通常,如果您要扩展内存块,则可能没有足够的空间来将其扩展到位。在这种情况下realloc分配一个新的内存块,将旧对象的内容复制到新分配的块中,并返回指向新块的指针。如果您不将结果分配给指针对象,那么您就丢失了它(旧块被释放,并且您不知道新块在哪里)。

realloc甚至可以返回指向新分配的内存块的指针,如果shrinks分配的块。可能有充分的理由从不同的内存区域分配较小的块。

您还需要注意的是realloc可能会失败。如果是,它返回一个空指针——并且旧指针仍然有效(只是没有指向您想要的大小的内存块)。 (原则,realloc即使新大小小于旧大小,也可能会失败。)因此,除非您对分配失败的响应是中止程序,或者至少中止使用指针的部分,否则您应该将结果分配给不同的指针对象:

int *ptr = ...;
int *new_ptr;
new_ptr = realloc(ptr, new_size);
if (new_ptr == NULL) {
    /* ptr still points to the old block of memory; you can try something else */
}
else {
    ptr = new_ptr; /* Now you can forget the old pointer value */
}

If realloc成功,它返回的指针值是有效的,而你传递给它的指针是无效的。

If realloc失败,它返回一个空指针,并且你传递给它的指针仍然有效。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么必须分配一个指针才能使 realloc 工作而不改变内存块中的第一个值? 的相关文章

  • 语言混合:模型和视图

    考虑开发一个应用程序 其中模型将使用 C 使用 Boost 编写 视图将使用 Objective C 使用 Cocoa Touch 编写 哪里有一些示例展示了如何集成 C 和 Objective C 来开发 iPhone 应用程序 直接从源
  • 使用内部构造函数实例化类

    我有一个类 其构造函数被定义为内部 这意味着我无法实例化它 虽然这可能有道理 但出于调试和研究目的 我仍然愿意做一次 是否可以通过反射来做到这一点 我知道我可以访问私有 内部成员 但是我可以调用内部构造函数吗 或者 由于构造函数没有做任何重
  • 以编程方式 Godaddy 发送的电子邮件不在“已发送邮件”文件夹中 C#.net

    我正在通过以下方式发送电子邮件ASP NET代码使用godaddy邮件服务器 邮件发送成功 但未存储在已发送邮件文件夹中 我正在使用下面的代码 SmtpClient client new SmtpClient client Host smt
  • .NET Windows 服务中调用 C# 的 wait 的 I/O 回调是否可以不阻塞?

    我知道在 ASP NET 中 当使用 wait 时工作线程会返回到池中 而 I O 发生在后台 这对于可扩展性非常有用 我的 Windows 服务是一个套接字服务器 它使用 Begin End 样式的异步套接字 I O 混合我的魔法 我知道
  • 将语句插入 SQL Server 数据库

    最近几天我试图找到这个错误 但没有成功 我正在尝试在数据库中插入一个新行 一切都很顺利 没有错误 也没有程序崩溃 My INSERT声明如下 INSERT INTO Polozaj Znesek Uporabnik Cas Kupec Po
  • 将占位符文本添加到文本框

    我正在寻找一种将占位符文本添加到文本框的方法 就像在 html5 中使用文本框一样 IE 如果文本框没有文本 则会添加文本Enter some text here 当用户单击它时 占位符文本消失并允许用户输入自己的文本 如果文本框失去焦点并
  • 实体框架7审计日志

    我正在将一个旧项目移植到 ASP NET 5 和 Entity Framework 7 我使用数据库优先方法 DNX 脚手架 来创建模型 旧项目基于Entity Framework 4 审计跟踪是通过重写实现的SaveChanges的方法D
  • C++ 模板参数类型推断

    我有一个这样的C 模板 template
  • 我们应该使用 Eval 还是 Databind 事件?

    当使用 Asp Net 并使用 ListView 等控件创建网站时 使用 Eval 命令是一个好习惯吗 还是应该在 databind 事件中填充文字和数据 取决于您是否想在更新事件上写回数据 在这种情况下数据绑定 如果您只想读取该数据 可以
  • ASP MVC 5 - 403 customError 不起作用

    我正在尝试为我的应用程序创建自定义错误页面 它在大部分情况下都有效 但不适用于403 errors 我的网络配置
  • 在非指针变量和类成员上放置 new

    考虑以下示例 include
  • IBM Watson 对话服务错误:无法从“方法组”转换为“conversation.onMessage”

    我正在尝试运行 IBM Watson会话服务团结和下面是代码片段 https github com watson developer cloud unity sdk conversation private Conversation m C
  • IEnumerable.比带中断的 for 循环更快吗?

    我们的代码打开表单时遇到了一些缓慢的情况 这可能是由于for循环与break这需要很长时间才能执行 我把它切换到IEnumerable Any 并看到表格很快打开 我现在试图弄清楚是否单独进行此更改会提高性能 或者是否正在访问Product
  • Unity 2.0 和处理 IDisposable 类型(特别是使用 PerThreadLifetimeManager)

    我知道类似的问题被问过好几次 例如 here https stackoverflow com questions 987761 how do you reconcile idisposable and ioc here https stac
  • 如何使用eclipse构建C++应用程序

    我已经从以下位置下载了 Eclipse Juno for C here http www eclipse org downloads download php file technology epp downloads release ju
  • 停止 TcpListener 的正确方法

    我目前正在使用 TcpListener 来处理传入连接 每个连接都有一个线程用于处理通信 然后关闭该单个连接 代码如下 TcpListener listener new TcpListener IPAddress Any Port Syst
  • printf 参数不足

    我的问题是关于缺少参数的 printf 之后的行为 printf s blah blah d int integer was given as argument and not int written 我已经知道 如果格式参数不足 则行为是
  • 向每个收件人发送一封包含不同内容的电子邮件(使用抄送字段)

    在你因为这个问题 毫无意义 和 不可能 而驳回之前 请听我说完 问题 我们在使用我们的系统发送的每封电子邮件中实施跟踪像素 即具有唯一 URL 的可下载 GIF 文件 这有助于我们跟踪电子邮件的打开情况 问题是 当我们抄送一些收件人时 跟踪
  • Visual Studio 2015默认附加库

    当我在 VS 2015 中创建一个空项目时 它会自动将这些库放入 附加依赖项 中 kernel32 lib user32 lib gdi32 lib winspool lib comdlg32 lib advapi32 lib shell3
  • 如何获取通过网络驱动器访问的文件的 UNC 路径?

    我正在 VC 中开发一个应用程序 其中网络驱动器用于访问文件 驱动器由用户手动分配 然后在应用程序中选择驱动器 这会导致驱动器并不总是映射到相同的服务器 我该如何获取此类文件的 UNC 路径 这主要是为了识别目的 这是我用来将普通路径转换为

随机推荐

  • 如何通过 sudo 运行命令并通过 ssh 输入密码 C#

    我想在具有 Linux 操作系统的远程计算机上运行命令并获取结果 我正在使用 ssh net 库通过 C 代码进行连接 我可以连接并运行一些不需要使用的命令 sudo 前 但我不知道如何运行需要 sudo 运行的命令 因为运行后 例如 su
  • 同时运行不同的表单

    我试图同时显示 2 个不同的表单 我尝试了以下代码 但它不起作用 Form1 t1 new Form1 Form2 t2 new Form2 t2 Show t1 Show Application Run 我还尝试从program cs运行
  • 如何验证文本字段,使其只能包含四位数

    我已经设法验证我的字段 因此它始终是四位数字 但我需要验证它始终是一个数字 我尝试添加这段代码 但它无法正常工作 if document ExamEntry cand value match numbers msg Only use num
  • 人类生成的数字和软件生成的数字哪个更随机?

    Does it 抛硬币获得随机位 Or 掷骰子获得 1 到 6 之间的随机整数 Or 从洗好的牌堆中取出一张牌获取 1 到 52 之间的数字 或者它能像我们一样思考或拥有像我们一样的智慧吗 显然 上面的例子不能成为生成随机数据的方法 那么软
  • 并排放置直方图

    我想在 gnuplot 中对类似于此图像的直方图 rowstacked 进行分组 我有这两个文件 其中直方图的数据来自 Round robin Input West Virginia ChicagoI ChicagoII Californi
  • 如何限制对Docker容器中路径的访问?

    Here我编写了一个 Dockerfile 用于测试用户访问 另一个文件 run sh 在此link 到目前为止 我已经这样做了 从 Ubuntu 12 04 05 开始 使用 sudo 和 ssh 服务器创建一个新容器 将默认 root
  • JUnit/HSQLDB:使用 HSQLDB 测试时如何解决 Oracle 语法错误(无特权和/或无 DUAL 对象)

    我有 DAO 代码 其中包含一些具有 Oracle 特定语法的 JDBC 例如 select count cnt from DUAL where exists select null from TABLE NAME where LOCATI
  • 什么时候应该在 C++ 中使用 new 关键字?

    我使用 C 有一段时间了 我一直想知道new关键词 简单地说 我应该使用它还是不使用它 随着new关键词 MyClass myClass new MyClass myClass gt MyField Hello world 如果没有new关
  • Javascript - 离开页面时确认

    我正在尝试实现一个基本的弹出窗口 询问用户是否真的想要离开页面 类似于如果我尝试在编写此消息的过程中关闭窗口 则会在该网站上发生的情况 我意识到这通常会引起人们的不满 但我有充分的理由想要这样做 我通过使用以下代码使其工作 function
  • 子路径上有多个 Django 项目 + Nginx

    我正在尝试运行多个用 Django 编写的仪表板以在我的服务器上运行 但无法启动并运行它 已关注这个数字海洋教程并根据其进行修改这个答案 现在一切都已启动并正在运行 但是当我指向我的 URL 时 它显示 Nginx 欢迎页面http ipa
  • ?? Swift 中的运算符

    在 Swift 编程语言 一书中 第 599 页 中 我遇到了这段令我困惑的代码片段 事情是这样的 func buyFavoriteSnack person String throws let snackName favoriteSnack
  • IE 8 对每页样式表的数量有限制吗?

    In 关于 CSS 的回答 一位用户说道 据说 Internet Explorer has 有 4096 CSS 的限制rules每个文件 参考 此外 它对可以嵌入到单个文档中的样式表数量也有限制 我认为是20 虽然参考MSDN似乎证实了这
  • 列表中的平均分

    第一次发帖 如果写得不好请见谅 我在一个文件中有一份列表 其中包含学生的姓名 ID 分数等 见下文 我想计算另一个文件中的平均分数 但我不知道如何只取分数并将平均值写入另一个文件中 Thanks name surname student i
  • 我们可以在 Chrome 扩展程序中检索机器序列号吗?

    我们可以在 Chrome 扩展程序中检索机器序列号吗 例如 我可以通过在 shell 中执行以下命令来获取 Windows 中的序列号 wmic BIOS 获取序列号 如何在 Chrome 扩展程序中获取此序列号 不会 Chrome 扩展程
  • 使用 HTML 和 JavaScript 返回 PartialView

    我正在进行 AJAX 调用 使用 jQuery 来检索PartialView 除了 HTML 之外 我还想发回视图正在显示的对象的 JSON 表示形式 我一直使用的蹩脚方法是将属性作为隐藏输入嵌入到 HTML 中 这很快就会变得笨拙并且紧密
  • 实体数据栏和数据栏最小值的手动版本和编码版本之间的外观不一致

    我正在尝试在 EPPlus 4 0 4 中创建可靠的数据栏 但遇到了两个问题 首先 我一直无法弄清楚如何创建纯色填充颜色 其次 至少对于较小的值 条形图没有按照我期望的方式显示 下面的屏幕截图说明了这两个问题 在这两种情况下 所需的结果都是
  • VC++ 2008,OpenProcess 总是返回错误 5(访问被拒绝)

    有人知道为什么当我尝试使用 PROCESS ALL ACCESS 作为我所需的访问权限调用 OpenProcess 时 MSVC 2008 总是在 GetLastError 上返回错误 5 吗 PROCESS VM READ 工作得很好 我
  • 为什么我不能使用 pygame.image.load 作为类属性?它说“如果没有初始化 pygame.display 就无法转换”

    以下块产生错误cannot convert without pygame display initialized当用作类属性时 class Tile hidden image pygame image load image0 bmp hid
  • EF6 数据库首先将存储过程设为异步

    在异步模式下运行 EF6 存储过程 数据库优先 的正确方法是什么 我读到ToListAsync 但我没有看到存储过程可用 还不确定当实际调用返回 1 OUT 参数或 2 项目列表时是否有不同的方式来调用存储过程 Case 1 using D
  • 为什么必须分配一个指针才能使 realloc 工作而不改变内存块中的第一个值?

    int ptr realloc ptr count sizeof int or ptr realloc ptr count sizeof int 我注意到如果我多次使用选项号一 第一个内存地址的值 ptr指向 变为未定义 尽管内存块中的所有