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

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(使用前将#替换为@)

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

随机推荐

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

    如何检测上传的图像是否包含恶意代码并将其从临时文件夹中删除 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