根据 C 标准,写入然后读取不同的联合成员是否未定义? [复制]

2024-02-09

我读到这段代码根据 c 标准是未定义的,但我找不到原因。 它在 gcc 8.1.0 和 clang-6.0 中编译没有错误并打印 1。

代码如下:

#include <stdio.h>

int main()
{
   union {
     int i;
     short s;
   } u;  
   u.i = 42;
   u.s = 1;

   printf("%d\n", u.i);
   return 0;
}

根据 C11 规范,§6.5.2.3 注释 95:

如果用于读取联合对象内容的成员与上次用于读取内容的成员不同 在对象中存储一个值,该值的对象表示的适当部分被重新解释 作为新类型中的对象表示,如 6.2.6 中所述(这个过程有时称为“type 双关语”)。这可能是一个陷阱表示。

这表示您正在做的事情是允许的,但也意味着您读取的值可能不是您所期望的(例如通过写入int会员并阅读float成员)。

还有关于陷阱表示值的警告,在这种情况下,行为将是未定义的。为了二进制补码 https://en.wikipedia.org/wiki/Two's_complement不过,对于整数系统(这是过去几十年所有计算机中的绝大多数)来说,这不是整数值的问题。


在你的情况下,结果很大程度上取决于平台字节顺序 https://en.wikipedia.org/wiki/Endianness。要么你会得到你写的值(1)或者你会得到0.

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

根据 C 标准,写入然后读取不同的联合成员是否未定义? [复制] 的相关文章

  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 从 Cordova 2.5 升级到 Cordova 3.0,在使用 CordovaInterface 时遇到问题

    我正在将我的项目从 Cordova 2 5 迁移到 Cordova 3 遵循中提到的迁移过程 http cordova apache org docs en 3 0 0 guide cli index md html http cordov
  • 从电子邮件中删除无效字符

    我想帮助用户在电子邮件输入中错误地输入无效字符 服务器端验证 清理前 注意 我不在前端验证电子邮件 只是清理 Coffeescript Element find input type email on change keyup event
  • Frederickson堆选择算法简单解释

    Frederickson 的堆选择算法是否有任何简单的解释 可以在 O k 时间内找到在线任何地方可用的最小堆中的第 k 个排序元素 如果没有 任何人都可以解释该算法的内部原理吗 尝试谷歌搜索 frederickson heap selec
  • 如何将自定义默认生成操作关联到 Visual Studio 中的自定义文件类型?

    我有一个为自定义文件类型构建的语言服务 此外 我还在 MSBuild 项目文件中创建了一个自定义目标 构建操作 但是 我无法找到任何方法将该构建操作默认关联到我的自定义文件扩展名 例如 如果添加 cs 文件 则构建操作默认为 编译 我想为我
  • php strip_tags 删除所有内容

    我在用户输入上使用 strip 标签来删除所有可能的标签 但 strip tags php 函数也会删除 例如 某些用户可能会使用表情符号 gt 或者这甚至可以在算法等时使用 是否有任何解决方案允许带状标签上的 问题是在这种情况下 foo
  • MySQL 工作台插入

    我正在使用 MySQL Workbench 5 2 28 来设计我的数据库架构 我需要将默认数据插入到一些表中 这可以使用 插入 选项卡来完成 然而 它似乎只允许手动输入数据 一次一行 我有一个包含数百行的 OUTFILE 我想插入这些行
  • React SetState 不调用 render

    我将我的函数发送到子组件callBack 在父级中 我有一个函数setState method onInputUpdated id var array let char id slice 1 console log this state s
  • ASP.NET MVC;一次只能为一名用户编辑选项

    我有一个表 其中包含三个字段和一些记录 如果用户要编辑表中的记录 则不允许其他用户同时编辑该记录 我可以采取哪些步骤来实现这一目标 许多具有桌面应用程序背景的人会想知道这是如何在 Web 应用程序中完成的 锁定记录标志 桌面世界中的一种方法
  • 如果与 ClientHttpRequestInterceptor 一起使用,Spring Resttemplate postforobject 将返回 null 作为对象响应

    我正在尝试使用休息服务 并且正在使用 Spring 发布一些数据RestTemplate postForObjectMethod但我收到空响应 即使我可以在有效负载中看到请求和响应 更新 我正在使用拦截器实现ClientHttpReques
  • CI::报告没有为 Ruby Test::Units 生成 xml?

    我正在尝试使用 CI reporter 生成 ruby 单元测试报告 我的耙文件 require rake require rake testtask require rake packagetask require rake requir
  • 两列并排可滚动

    我的页面看起来像这样 我有两个单独的 div 一个是产品过滤器 另一个是产品 div 产品内容可以显示 40 个产品或 100 个产品或无 即内容可以稍后更改 同样 我的过滤器的长度也可以变化 我希望以某种方式使过滤器 div 可滚动 并使
  • 如何将 AWS S3 url 转换为 boto 的存储桶名称?

    我正在尝试访问http s3 amazonaws com commoncrawl parse output segment http s3 amazonaws com commoncrawl parse output segment 桶与
  • OpenCL 动态并行/GPU 生成的线程?

    CUDA 5 刚刚被释放 http nvidianews nvidia com Releases NVIDIA Releases CUDA 5 Making Programming With World s Most Pervasive P
  • Stream 和 Spring Data 的优点

    有些人重写 CrudRepository 的方法 findAll 以返回 Stream java 8 但我看到他们最终将 Stream 转换为 List 以便通过其余控制器发送它 他们为什么使用 Stream 在这里使用 Stream 有什
  • Grails 集成测试不会回滚

    我正在从这本书中学习grails Grails 的实际应用 http my safaribooksonline com book web development ruby 9781933988931 并且我正在尝试从示例中运行集成测试 在书
  • 使用 VLC 托管无限视频循环流

    我想通过 WIFI 网络从带有 VLC 播放器的电脑向智能手机提供视频流以进行回归测试 视频在智能手机上播放完毕后应自动重新开始 我目前使用 rtsp 作为协议和循环选项 但这不是强制性的 问题是 每次视频重新启动时 都需要进行新的 rts
  • 如何检查 Azure 中应用程序网关的运行状况

    如何使用java sdk检查应用程序网关的健康状况 我需要使用 java sdk 执行类似的操作 如下面的 azure cli 命令 天蓝色网络应用程序网关后端运行状况显示 1 2 json jq r backendAddressPools
  • Redis 中的绝对缓存和滑动缓存

    我想在Redis中实现绝对缓存和滑动缓存 有没有人有任何资源链接 这会有帮助 Redis 已经有很多用于此目的的命令 EXPIRE http redis io commands expire 设置按键超时时间 EXPIREAT http r
  • 将 1GB 数据加载到 hbase 需要 1 小时

    我想将 1GB 1000 万条记录 的 CSV 文件加载到 Hbase 中 我为它编写了 Map Reduce 程序 我的代码运行良好 但需要 1 小时才能完成 最后一个Reducer 花费了半个多小时的时间 有人可以帮我吗 我的代码如下
  • 根据 C 标准,写入然后读取不同的联合成员是否未定义? [复制]

    这个问题在这里已经有答案了 我读到这段代码根据 c 标准是未定义的 但我找不到原因 它在 gcc 8 1 0 和 clang 6 0 中编译没有错误并打印 1 代码如下 include