在同一函数内,通过间接访问不在作用域内的局部变量是否是 UB?

2024-01-12

在第二个右大括号之后,b只能通过间接访问a.

int main() {
    int *a;
    {
        int b = 42;
        a = &b;
    }
    printf("%d", *a); // UB?
    return 0;
}

Since b不再在范围内,这是 UB 吗?我知道从已经返回的函数中取消引用指向非静态局部变量的指针是 UB 的做法,但在这种情况下,所有内容都在同一个函数内。

这是 C++ 中的 UB,但我不确定 C 的情况。


是的,这是未定义的访问行为any已经达到它的变量生命尽头。这里的范围和存储持续时间略有不同。范围更多的是“变量标识符何时可见?”存储时间是“变量本身什么时候存在?”。

你可以让事情在范围内并且持久,例如:

int main (void) {
    int spoon = 42;
    // spoon is both in scope and enduring here
    return 0;
}

或者超出范围但持久:

int main (void) {
    int *pSpoon;
    {
        static int spoon = 42;
        pSpoon = &spoon;
    }
    // spoon is out of scope but enduring here (use *pSpoon to get to it)
    return 0;
}

您还可以使用超出范围且不持久的变量,例如:

int main (void) {
    // spoon is neither in scope nor enduring here ("there is no spoon")
    return 0;
}

事实上,唯一不能拥有的就是变量在作用域内但不持久。标识符与存储绑定在一起,因为允许没有后备存储的变量没有什么意义。

我不是在这里讨论指针,这是一个额外的间接级别 - 范围内指针变量always具有指针值本身的存储空间,即使它指向的东西to其存储期限已结束或尚未开始。

事实上,未定义的行为在某些情况下可能起作用,但这绝不会使行为得到定义,事实上,这是未定义行为最烦人的特征之一,因为它有时does工作。不然更容易被发现。

在这种特殊情况下,b变量存储持续时间结束于内部右大括号,因此尝试在那之后访问它是不明智的。


该标准的控制部分是c11 6.2.4 Storage duration of objects(稍微解释一下以删除不必要的部分):

对象具有决定其生命周期的存储持续时间。有四个存储 持续时间:静态、线程、自动和分配。

其标识符声明时没有链接且没有存储类说明符 static 的对象具有自动存储持续时间。

对于这样的对象,其生命周期从进入与其关联的块开始延伸,直到该块的执行以任何方式结束。

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

在同一函数内,通过间接访问不在作用域内的局部变量是否是 UB? 的相关文章

  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 控件的命名约定[重复]

    这个问题在这里已经有答案了 Microsoft 在其网站上提供了命名指南 here http msdn microsoft com en us library xzf533w0 VS 71 aspx 我还有 框架设计指南 一书 我找不到有关
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查

随机推荐

  • MySQL SHOW COLUMNS 返回顺序

    我需要找到特定表中的列 这没有问题 SHOW COLUMNS FROM tablename LIKE ColumnPrefix 但我需要知道它们将返回什么顺序 最好选择按字母顺序对结果进行升序排序 我没有使用过运气ORDER BY 有任何想
  • 何时使用 mysql_real_escape_string?

    我什么时候应该使用 mysql real escape string 仅当我将行插入数据库时 才出现这种情况吗 或者只有当我有用户输入时 Thanks 每当您构建将针对数据库运行的查询时 您都应该使用 mysql real escape s
  • 如何使用 .htaccess 创建干净的 url

    这是我的 htaccess 代码 RewriteEngine On RewriteRule a zA Z0 9 movie php name 1 RewriteEngine on RewriteCond HTTP HOST www exam
  • MySQL如何存储数据

    我环顾谷歌但没有找到任何好的答案 它将数据存储在一个大文件中吗 它使用什么方法使数据访问比仅仅读写常规文件更快 这个问题有点老了 但我还是决定回答它 因为我一直在对此进行一些挖掘 我的答案是基于linux文件系统 基本上 mySQL 将数据
  • url 重写中附加文档根

    我想重写网址http www example com books PHP wrox http www example com books PHP wrox to http www example com manuals opensource
  • 使用 JIT 编译器的 Collections.emptyList 和空 ArrayList 的性能

    使用之间是否有性能差异Collections emptyList 或一个空的ArrayList 特别是在使用 JIT 编译器时 我可以想象 例如 JIT 编译器不会执行内联或静态方法调用 因为执行的方法取决于类型 Edit我知道Collec
  • 使用 matplotlib 的plotfile函数时用散点图代替线图

    我知道plotfile的一般用法 import matplotlib pyplot as plt plt plotfile csvfile sometuple 但这默认会生成线图 我想要一个散点图 我需要传递给这个方法一些特殊的参数吗 我已
  • 如何使用 Kotlin 协程的事务来增加实时数据库中的计数器?

    要增加实时数据库中的数量 我可以简单地使用 override fun incrementQuantity flow try heroIdRef update quantity FieldValue increment 1 await emi
  • Laravel 集合搜索不区分大小写

    我正在搜索一个集合 我希望此搜索不区分大小写 或者至少将集合值更改为小写 我怎样才能做到这一点 value strtolower value collection collection gt where attribute value va
  • 模板方法在哪里实例化?

    为了使用带有智能指针的不完整类型 例如boost scoped ptr 必须在相应的 CPP 文件中为父类显式定义一个空的析构函数 例子 H file class Foo public Foo private class Pimpl boo
  • 条件运算符慢吗?

    我正在查看一些代码 每个案例都有一个巨大的 switch 语句和 if else 语句 并立即感受到优化的冲动 作为一名优秀的开发人员 我始终应该着手获取一些硬性计时事实 并从三个变体开始 原始代码如下所示 public static bo
  • 在 IProject - Eclipse 中搜索文件

    我需要找到 Eclipse 项目中存在的特定文件 该文件位于项目的类路径中 I have IProject实例但不知道如何获取IFile实例 The IProject接口扩展了IContainer其中有几个findMember方法 你得到一
  • Appengine 模块:使用dispatch.yaml 进行路由不起作用

    我正在使用模块 但我无法按照此处所述的方式使用路由https developers google com appengine docs python modules routing https developers google com a
  • 使用 Plotnine 按排序顺序绘图

    我有一个正在尝试绘制的数据框 我希望数据点在图中沿 x 轴按排序顺序显示 我尝试在将数据帧传递给 ggplot 之前对其进行排序 但是我的订单被忽略 我的数据如下 我想按 值 属性排序 var1 var2 value direction 0
  • Firebase 无法部署

    我有一个 Firebase 项目 我已经维护了几个月 没有遇到任何问题 我尝试过跑步firebase deploy多次无果 我用谷歌搜索了它 并在 SO github 和其他网站上进行了搜索 found https stackoverflo
  • 使用 Hibernate 3.6.0.Final 禁用保存/更新时的 Hibernate 验证

    我刚刚开始将使用 Hibernate 3 5 6 Final 的应用程序升级到 3 6 0 Final 并且出现了一些问题 最后一个问题我找不到解决方案 当通过 Hibernate 保存 更新对象时 3 6 0 Final 似乎会自动打开
  • 温莎城堡:如何更新组件注册

    如果我在配置中定义了 container Register Component For
  • 如何并行处理 CSV 文件?

    我的计算机上的目录中有几千个 CSV 文件 需要根据我制定的正则表达式进行验证 path to validator 指向 Scala 脚本 该脚本通过命令行上的 windows bat 文件运行 它读取正则表达式和 csv 文件并给出 通过
  • 将变量从 PHP 传递到 javascript 并传递到 html 表单

    我在 WordPress 中使用 jQuery jQuery 表单和 PHP Mail 设置的联系表单来发送表单生成的电子邮件 但确实遇到了一个非常小的问题 为了替换我当前的联系表单 从联系表单页面内执行 pHp 验证 然后使用 PHP M
  • 在同一函数内,通过间接访问不在作用域内的局部变量是否是 UB?

    在第二个右大括号之后 b只能通过间接访问a int main int a int b 42 a b printf d a UB return 0 Since b不再在范围内 这是 UB 吗 我知道从已经返回的函数中取消引用指向非静态局部变量