编译器是否允许回收释放的指针变量?

2023-12-02

有人声称

a compiler is free to reuse the pointer variable for some other purpose after the realloc being freed, so you have no guarantee that it has the same value as it did before

ie

void *p = malloc(42);
uintptr_t address = (uintptr_t)p;
free(p);

// [...] stuff unrelated to p or address

assert((uintptr_t)p == address);

可能会失败。

C11 附件 J.2 内容如下

指向通过调用 free 或 free 释放的空间的指针的值 使用 realloc 函数 (7.22.3) [未定义]

但附件当然不是规范性的。

附件 L.3(这是规范性的,但可选)告诉我们,如果

指向通过调用 free 或 realloc 释放的空间的指针的值 使用函数(7.22.3)。

结果允许是关键的未定义行为。

这证实了这一说法,但我希望看到标准本身而不是附件中的适当引用。


当一个对象到达其生命周期结束时,所有指向它的指针都变成不定。这同样适用于块范围变量和分配的内存。适用的条款是 C11 中的 6.2.4:2。

对象的生命周期是程序执行的一部分,在此期间保证为其保留存储空间。对象存在,具有常量地址,并在其整个生命周期中保留其最后存储的值。如果一个对象在其生命周期之外被引用,则行为是未定义的。当指针指向(或刚刚过去)的对象到达其生命周期结束时,指针的值变得不确定。

将不确定内存用于任何事情,包括明显无害的比较或算术,都是未定义行为(在 C90 中;后来的标准使问题变得非常复杂,但编译器继续将不确定内存的使用视为未定义行为)。

举个例子,下面的程序如何打印p and q既不同又相同?显示不同编译器的执行结果here.

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main(int argc, char *argv[]) {
  char *p, *q;
  uintptr_t pv, qv;
  {
    char a = 3;
    p = &a;
    pv = (uintptr_t)p;
  }
  {
    char b = 4;
    q = &b;
    qv = (uintptr_t)q;
  }
  printf("Roses are red,\nViolets are blue,\n");
  if (p == q)
    printf ("This poem is lame,\nIt doesn't even rhyme.\n");
  else {
    printf("%p is different from %p\n", (void*)p, (void*)q);
    printf("%"PRIxPTR" is not the same as %"PRIxPTR"\n", pv, qv);
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编译器是否允许回收释放的指针变量? 的相关文章

  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 获取按下的按钮的返回值

    我有一个在特定事件中弹出的表单 它从数组中提取按钮并将标签值设置为特定值 因此 如果您要按下或单击此按钮 该函数应返回标签值 我怎样才能做到这一点 我如何知道点击了哪个按钮 此时代码返回 DialogResult 但我想从函数返回 Tag
  • UML类图:抽象方法和属性是这样写的吗?

    当我第一次为一个小型 C 项目创建 uml 类图时 我在属性方面遇到了一些麻烦 最后我只是将属性添加为变量 lt
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何在 VBA 中声明接受 XlfOper (LPXLOPER) 类型参数的函数?

    我在之前的回答里发现了问题 https stackoverflow com q 19325258 159684一种无需注册即可调用 C xll 中定义的函数的方法 我之前使用 XLW 提供的注册基础结构 并且使用 XlfOper 类型在 V
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内

随机推荐

  • 检查图像是否存在恶意代码并将其删除

    如何检测上传的图像是否包含恶意代码并将其从临时文件夹中删除 code FILES file tmp name 据我所知 没有办法阻止它访问 tmp 文件夹 我读到我可以使用 file data getimagesize FILES file
  • 如何使用blueimp jQuery文件上传:Struts 2中文件上传结果为空,文件项为空

    我使用的是Blueimp 服务器端是Java Struts2 我找不到使用 Java 的示例 无论如何我设法使用示例代码 但我得到了 Empty file upload result 当我也尝试上传单个文件时 HTML 部分是相同的 我不在
  • 如何在 Perl 程序中创建等待省略号?

    以下代码无法正常工作 print Processing your listing sleep n print sleep n print sleep n print n n 试图在有的地方得到一些东西 然后另一个 然后另一个 进而Proce
  • 从 scala 中的嵌套 json 文件创建 Spark 数据框 [重复]

    这个问题在这里已经有答案了 我有一个如下所示的 json 文件 group lang 1 scala functional 2 java object 3 py interpreted 我尝试使用创建一个数据框 val path some
  • 从 PHP 数组中删除一个值

    使用 PHP 我尝试根据元素的值从数组中删除元素 例如 使用以下数组 Array 671 gt Array 0 gt 1 1 gt 100 2 gt 1000 900 gt Array 0 gt 15 1 gt 88 我希望能够指定要删除的
  • 如何向 dateFormatter 添加字符

    我跟着this答案 但它对我不起作用 我想将我的时间格式化为 2017 09 11T11 45 00 04 00 我正在做 let xFormatter DateFormatter xFormatter dateFormat yyyy MM
  • CSS 可以选择具有特定内容的元素吗? [复制]

    这个问题在这里已经有答案了 可能的重复 CSS 3 内容选择器 我想知道 是否可以使用 CSS 根据元素的内容来选择元素 我意识到我可以使用这样的东西 this href foo php And the styles 但有没有一种方法可以根
  • 如何检查 pandas DataFrame 是否为空?

    如何检查是否有熊猫DataFrame是空的 我想在终端中打印一些消息 如果DataFrame是空的 您可以使用该属性df empty检查它是否为空 if df empty print DataFrame is empty Source 熊猫
  • OpenCV / Python:用于实时面部识别的多线程

    我正在使用 OpenCv 和 Dlib 来执行面部识别带地标 来自网络摄像头流 语言是Python 它在我的 MacBook 笔记本电脑上运行良好 但我需要它从台式计算机 24 7 运行 该计算机是一台运行 Debian Jessie 的
  • 在烧瓶中发送发布请求时出现错误(python)

    我正在向协程函数发送一个发布请求 但出现以下错误 Traceback most recent call last File usr local lib python3 4 site packages flask app py line 19
  • 为 Cygwin 启用本机 NTFS 符号链接

    最近的 NTFS 和 Windows 实现了符号链接 NTFS连接点自 NTFS 3 0 Windows 2000 起可用作目录符号链接linkd or junction tools NTFS 符号链接也可以用作符号链接 对于文件和目录 因
  • app.config

    假设我有一个使用 VS2008 针对 NET 2 0 构建和编译的 WinForms 应用程序 据我了解 在运行时 应用程序将首先尝试加载 NET 2 0 CLR 因为这是它的编译对象 不管app config 文件的任何 supporte
  • Windows Phone 8.1 从代码发送 HTML 邮件

    我试图打开邮件应用程序 其内容在代码中定义 但是当我发送它时 gmail oulook 显示为纯文本而不是 HTML private async void SendEmail string url EmailMessage mail new
  • C# 将日期时间转换为自定义格式

    我正在查询一个datetime dd mm YYYY hh mm ss 数据库中的值并将其插入到列表中 如下所示 ord invoiceDate dt Rows i invoicedate ToString 如何将此字符串转换为自定义格式
  • 在matlab中使用bitshift绘制RGB直方图

    我正在尝试在 Matlab 中创建马赛克图像 该数据库主要由 RGB 图像组成 但也包含一些灰度图像 我需要计算直方图 就像维基百科文章的示例中关于颜色直方图 对于 RGB 图像 考虑使用 Matlab 中的位移运算符来组合 R G 和 B
  • HTML5 - mp4 视频无法在 IE9 中播放

    我有一个 mp4 视频 我想使用 HTML5 在 IE9 中播放
  • startManagingCursor() 在服务中?

    有没有办法在服务中而不是活动中使用 startManagingCursor 并获得相同的结果 如图所示here 更具体地说 我想根据服务的生命周期管理给定游标的生命周期 例如 当服务被销毁时 它将自动对给定的 Cursor 调用 deact
  • 如何传递非静态函数作为回调? [复制]

    这个问题在这里已经有答案了 我目前正在使用 Qt 和图形引擎 在 QGLWidget 实例的初始化期间 我需要将一些函数指针传递给我的引擎 寻找回调的函数是 virtual void Buffer CreateCustom byte get
  • 如何创建带有图像的单选按钮

    我想要一个带有图像而不是文本的单选按钮 所以我想要一个男性和女性的图像 而不是男性和女性的文本 这实际上可以使用标准 HTML 来完成还是必须使用 jQuery 我该怎么做呢 Use
  • 编译器是否允许回收释放的指针变量?

    有人声称 a compiler is free to reuse the pointer variable for some other purpose after the realloc being freed so you have n