具有相同成员类型的 C 结构是否保证在内存中具有相同的布局?

2024-04-14

本质上,如果我有

typedef struct {
    int x;
    int y;
} A;

typedef struct {
    int h;
    int k;
} B;

我有A a,C 标准是否保证((B*)&a)->k是相同的a.y?


具有相同成员类型的 C 结构是否保证在内存中具有相同的布局?

几乎是的。对我来说足够近了。

来自 n1516,第 6.5.2.3 节,第 6 段:

...如果联合包含多个共享公共初始序列的结构...,并且如果联合对象当前包含这些结构之一,则允许在声明该结构的任何位置检查其中任何结构的公共初始部分联合体的完整类型可见。两个结构共享一个共同初始序列如果对应的成员对于一个或多个初始成员的序列具有兼容的类型(对于位字段,具有相同的宽度)。

这意味着如果您有以下代码:

struct a {
    int x;
    int y;
};

struct b {
    int h;
    int k;
};

union {
    struct a a;
    struct b b;
} u;

如果您分配给u.a,标准说你可以从u.b。它扩大了合理性的范围,表明struct a and struct b考虑到这一要求,可以有不同的布局。这样的系统将是极端病态的。

请记住,该标准还保证:

  • 结构从来都不是陷阱表示。

  • 结构体中字段的地址增加(a.x总是在之前a.y).

  • 第一个字段的偏移量始终为零。

然而,这很重要!

你重新表述了这个问题,

C 标准是否保证((B*)&a)->k与 a.y 相同吗?

不!而且它非常明确地表明它们不一样!

struct a { int x; };
struct b { int x; };
int test(int value)
{
    struct a a;
    a.x = value;
    return ((struct b *) &a)->x;
}

这是一种别名违规行为。

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

具有相同成员类型的 C 结构是否保证在内存中具有相同的布局? 的相关文章

随机推荐

  • 合并字典并添加值

    我有几个字典 我想将它们组合起来 这样如果一个键位于多个字典中 则值会添加在一起 例如 d1 1 10 2 20 3 30 d2 1 1 2 2 3 3 d3 0 0 merged 1 11 2 22 3 33 0 0 在 Python 中
  • 如何使用Java读取(.bib)文件格式的内容

    我需要读取 bib 文件并将其标签插入到 bib entries 的对象中 文件很大 几乎 4000 行 所以我的第一个问题是使用什么 bufferedReader 和 FileReader 一般格式是 ARTICLE orleans01D
  • 最坏情况时间复杂度 put/get HashMap

    当 Hashmap 的键的哈希码始终相等时 它的最坏情况时间复杂度是多少 根据我的理解 由于每个键都有相同的哈希码 因此它总是会进入同一个存储桶并循环遍历它以检查 equals 方法 因此对于 get 和 put 时间复杂度应该是 O n
  • RenderFlex 底部溢出了 99241 像素,并且 Null 检查运算符用于 null 值

    小部件库捕获异常 构建 BottomTabBtn dirty 时抛出以下 CastError 对空值使用空检查运算符 The relevant error causing widget was BottomTabBtn file C Use
  • Node.js 中 I/O 密集型的含义是什么

    我正在学习 Node js 还发现 Node js 最适合用于 I O 密集型任务 这让我有点困惑 因此 经过一些研究 我发现了这样的说法 读取和 或写入大量数据的应用程序 那么 这是否意味着 Node js 最好与数据一起使用 即读取大数
  • Camel-Jetty http代理+大响应数据导致问题:缓冲容量超出

    jetty专家 我在通过camel jetty作为http代理获取大数据时出错 欢迎任何经验 想法 建议 提前致谢 路线构建器代码 from servlet balancer matchOnUriPrefix true to jetty h
  • JVM 规范更新

    JVM 规范第 2 版的日期是 1999 年 自那时以来 我应该考虑学习哪些重要更新 如动态调用 这当然是为了了解现代 JVM 实现的内部原理 特别是 HotSpot 访问此链接http wikis sun com display HotS
  • 快速设置我的条形图的水平滚动

    我正在使用 Daniel Cohen Gindi 的图表框架 它很棒 但是 我希望我的条形图水平滚动以查看其他数据 我尝试添加滚动视图 但没有成功 我也尝试了不同的值 例如 barChart setVisibleXRangeMaximum
  • 捕获 Exception 类而不是 Exception 子类是不好的做法吗?

    我有一个抛出 Exception 子类的方法 如果我对 Exception 的每个子类执行相同的捕获功能 那么仅捕获 Exceptions 类是不好的做法 还是应该单独捕获每个异常 是的 这是不好的做法 因为它使 catch 块捕获不应该捕
  • 在silverlight中获取xml中的所有节点名称

    我创建了一个这样的xml
  • 带有 CoordinatorLayout 的 Snackbar 禁用关闭

    我正在使用支持 浮动操作按钮 Snackbar 协调器布局 我需要协调器布局这样如果SnackBar显示的是浮动操作按钮向上移动以为 Snackbar 腾出空间 为了更好地理解 请检查此video http material design
  • JSF 表格和德语变音符号

    我在我的一个 JSF 这是一个 Facelet 中遇到了一个奇怪的问题 我正在使用 Richfaces 在一页上我得到了一个普通表单
  • Application.Current.Shutdown() 不会终止我的应用程序

    我刚刚启动了一个新的 C WPF 应用程序 并使用了来自WPF Contrib 项目 http wpfcontrib codeplex com 我可以启动程序 将 退出 菜单项添加到 NotifyIcon 的 ContextMenu 然后将
  • 反 CSRF cookie?

    我正在构建一个大量使用ajax 的应用程序 大多数反 CSRF 解决方案都围绕将一些信息放入视图状态并在发布时处理该数据 但是 我无权访问 ajax 调用中的视图状态 我计划生成一个 GUID 以在 cookie 和会话状态中插入令牌 使
  • 在 Swift 中创建“forCount”控制结构

    在许多项目中 这种控制结构非常适合可读性 forCount 40 this block is run 40 times 你可以做正是如此 https stackoverflow com a 4844280 294884在 Objective
  • 获取当前脚本的路径

    我想以编程方式将工作目录设置为当前脚本的路径 但首先我需要获取当前脚本的路径 所以我希望能够做到 current path retrieve the path of current script setwd current path Jus
  • 如何在 python 中 POST xml 元素

    基本上我有这个 xml 元素 xml etree ElementTree 我想将其 POST 到 url 目前我正在做类似的事情 xml string xml etree ElementTree tostring my element da
  • 如何实时更新RecyclerView?

    我有一个列表 任何用户都可以随时更新 该列表显示在回收视图 我想实时更新这个列表 以便用户可以获得更好的用户体验 因为用户不需要多次执行刷新 现在的问题是 如何实时更新这个列表 使用 RecyclerView 您可以更新单个项目 项目范围或
  • 使用 UIManagedDocument 在 ios5 中预加载核心数据数据库

    我正在尝试在我的应用程序中包含预加载的核心数据数据库 我正在使用这里给出的解决方案query https stackoverflow com questions 8683892 pre load core data database in
  • 具有相同成员类型的 C 结构是否保证在内存中具有相同的布局?

    本质上 如果我有 typedef struct int x int y A typedef struct int h int k B 我有A a C 标准是否保证 B a gt k是相同的a y 具有相同成员类型的 C 结构是否保证在内存中