C 结构体顺序有任何保证吗?

2023-12-08

我广泛使用了结构,并且看到了一些有趣的东西,特别是*value代替value->first_value其中 value 是指向结构体的指针,first_value是第一个成员,是*value safe?

另请注意,由于对齐,无法保证大小,对齐值基于什么,架构/寄存器大小?

我们对齐数据/代码以加快执行速度,我们可以告诉编译器不要这样做吗?那么也许我们可以保证结构的某些事情,比如它们的大小?

当对结构成员进行指针算术以定位成员偏移量时,我认为您会这样做-如果是小尾数+对于大端,还是仅取决于编译器?

malloc(0) 真正分配什么?

以下代码用于教育/发现目的,并不意味着具有生产质量。

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

int main()
{
    printf("sizeof(struct {}) == %lu;\n", sizeof(struct {}));
    printf("sizeof(struct {int a}) == %lu;\n", sizeof(struct {int a;}));
    printf("sizeof(struct {int a; double b;}) == %lu;\n", sizeof(struct {int a; double b;}));
    printf("sizeof(struct {char c; double a; double b;}) == %lu;\n", sizeof(struct {char c; double a; double b;}));

    printf("malloc(0)) returns %p\n", malloc(0));
    printf("malloc(sizeof(struct {})) returns %p\n", malloc(sizeof(struct {})));

    struct {int a; double b;} *test = malloc(sizeof(struct {int a; double b;}));
    test->a = 10;
    test->b = 12.2;
    printf("test->a == %i, *test == %i \n", test->a, *(int *)test);
    printf("test->b == %f, offset of b is %i, *(test - offset_of_b) == %f\n",
        test->b, (int)((void *)test - (void *)&test->b),
        *(double *)((void *)test - ((void *)test - (void *)&test->b))); // find the offset of b, add it to the base,$

    free(test);
    return 0;
}

calling gcc test.c其次是./a.out我明白了:

sizeof(struct {}) == 0;
sizeof(struct {int a}) == 4;
sizeof(struct {int a; double b;}) == 16;
sizeof(struct {char c; double a; double b;}) == 24;
malloc(0)) returns 0x100100080
malloc(sizeof(struct {})) returns 0x100100090
test->a == 10, *test == 10 
test->b == 12.200000, offset of b is -8, *(test - offset_of_b) == 12.200000

Update这是我的机器:

gcc --version

i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

uname -a

Darwin MacBookPro 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; root:xnu-1504.15.3~1/RELEASE_I386 i386

从 6.2.5/20 开始:

结构类型描述了按顺序分配的非空成员对象集 (并且,在某些情况下,是一个不完整的数组),每个数组都有一个可选的 指定的名称和可能不同的类型。

回答:

特别是 *value 而不是 value->first_value,其中 value 是指向结构的指针,first_value 是第一个成员,*value 安全吗?

见 6.7.2.1/15:

15 Within a structure object, the non-bit-field members and the units in which bit-fields reside have addresses that increase in the order in which they are declared. A pointer to a structure object, suitably converted, points to its initial member (or if that member is a bit-field, then to the unit in which it resides), and vice versa. There may be unnamed padding within a structure object, but not at its beginning.1

然而,结构的末尾以及成员之间可能有填充字节。

In C, malloc( 0 )是实现定义的。 (顺便说一句,这是 C 和 C++ 的不同之处之一。)

[1] 强调我的。

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

C 结构体顺序有任何保证吗? 的相关文章

随机推荐

  • h2o.glm lambda 搜索似乎没有迭代所有 lambda

    请考虑以下基本的可重现示例 library h2o h2o init data iris iris hex as h2o iris iris hex mod h2o glm y Sepal Length x setdiff colnames
  • ASP.NET单元测试Windows7/IIS7

    今天花了几个小时尝试针对 ASP NET 项目编写一些单元测试 这是 Visual Studio 2010 将 Windows 7 企业版与 IIS7 结合使用 我采取的步骤是 向解决方案添加了新的测试项目 打开一个类文件作为网站的一部分
  • 如何高效、快速地用 JButton 完全填充 JFrame?

    因此 我正在努力用 Java 重新创建扫雷游戏 现在我需要将 JFrame 上的所有按钮放置在网格中 我的代码如下 import javax swing import java util ArrayList import java awt
  • 如何编辑Streamlit AgGrid行的单元格?

    我已经创建了AgGrid通过从 csv 文件加载数据 我通过外部按钮逐行添加行 但是当我尝试编辑我添加的行时 它消失了 如果您能帮助我找出错误所在 我将不胜感激 代码如下 import pandas as pd import streaml
  • React 事件处理函数无需使用 bind() 即可工作

    我正在学习 React 并且遇到了事件处理程序 在React中 建议将函数绑定到this 然后将其用作事件处理程序 但是 我没有绑定它 但仍然得到所需的输出 下面是我的代码 import React Component from react
  • 使用 Java 卡钱包

    我是一个java卡初学者 从示例中复制了下面的代码 不知何故 我已经知道部分代码是如何工作的 但还是对下面的事情感到困惑 ownerpin 的工作方式以及设置 pin 的方式和时间 如何进行信用和借记工作 我了解平衡是如何运作的 这方面还不
  • 如何在一个应用程序中获取多个图标来启动不同的活动?

    我有一个包含两个活动的应用程序 我希望能够在启动器中显示两个图标 每个图标在应用程序中启动相应的活动 具体来说 我想要一个图标来启动我的主应用程序 另一个图标来启动我的设置活动 这可能吗 这是我到目前为止所尝试过的
  • 复制到输出目录复制文件夹结构但只想复制文件

    我有一个 VS2008 我想将某些文件从目录复制到我的 bin 文件夹 我已经设置了文件 位于 common browserhawk 到 复制到输出目录 但是 它也会复制文件夹结构 文件被复制到 bin common browserhawk
  • 如何对重复标签进行分组,以便在 Chart.js 中创建没有重复的标签

    我似乎无法解决这个问题 我的唱片公司给我发回列表 在我的例子中 我希望只有 HOME40 HOME60 和 PRO 作为标签 但不幸的是它返回了它们的串联 我还想改变颜色 如果产品是HOME40那么颜色必须是绿色 如果是PRO那么颜色必须是
  • java中字节数组到短数组然后再返回

    我在获取存储在字节数组中的音频数据 将其转换为大端短数组 对其进行编码 然后将其更改回字节数组时遇到一些问题 这是我所拥有的 原始音频数据存储在audioBytes2中 我使用相同的格式进行解码 并在 cos 函数上加上减号 不幸的是 更改
  • Gmail 5.0 应用在收到 ACTION_SEND 意图时失败,并显示“附件权限被拒绝”

    我的应用程序创建带有附件的邮件 并使用意图Intent ACTION SEND启动邮件应用程序 它适用于我测试过的所有邮件应用程序 但新的 Gmail 5 0 它适用于 Gmail 4 9 除外 邮件在没有附件的情况下打开 显示错误 附件的
  • 在 Angular/JHipster 应用程序上使用另一个模块的组件

    我正在尝试使用component来自另一个module on an 角5生成的应用程序jhipster When a module其中包含component我想使用的是导入的route of the module发生导入的地方被覆盖rout
  • 在 Woocommerce 中下订单后,将附件添加到管理员电子邮件通知

    下新订单后 我尝试向商店管理员发送 PDF 文件 问题与woocommerce email attachments重点是电子邮件会同时发送给客户和管理员 add filter woocommerce email attachments at
  • 符合 MVC 4 站点 508

    我花了很多时间研究这个 但也许有人指出了我正确的方向 需要构建一个符合 508 标准的 MVC 4 网站 三年前我做了一些 508 合规性测试和标签插入 但我真的想再做一次 其他人用什么 寻找什么标签 什么测试工具 有免费的测试工具吗 AJ
  • iOS 登录/注销在 Swift 中的实现

    我一直在尝试快速实现 iOS 应用程序的登录 注销流程 这是我的故事板 在主视图控制器 即蓝屏 中 我实现了以下代码来检测用户是否已登录 然后自动将它们带到表视图控制器 覆盖 func viewDidAppear animated Bool
  • 作为文本框的 AutoCompleteCustomSource 的列表框项目

    我已使用数据源属性将一些项目填充到列表框中 现在我需要从列表框中列出的项目中为文本框设置 AutoCompleteCustomSource 准确地说 ListBox 的 DataSource 和 textBox 的 AutoComplete
  • 将 R 对象分组到列表中

    我已将一系列 SpatialPolygonsDataFrames 加载到我的工作区中 每个命名对象都有一个 adm0 adm1 or adm2 附有国家缩写 对于德国来说 这看起来像 DEU adm0 DEU adm1 and DEU ad
  • 用于检查 perl 模块是否已安装的 perl 脚本

    我希望能够对列表中的每个模块运行此测试 不知道如何 ger perl 循环遍历每个项目 use Module Load eval load Image Magick 1 or die you need Module to run this
  • LDAP Bind 似乎返回 true,密码为空

    我有这段代码根据 LDAP 目录对我的用户进行身份验证 当密码不正确时 它返回 false 但如果密码留空 它仍然会对用户进行身份验证 有什么想法可能会发生这种情况吗 if ldap bind ds user dn password sha
  • C 结构体顺序有任何保证吗?

    我广泛使用了结构 并且看到了一些有趣的东西 特别是 value代替value gt first value其中 value 是指向结构体的指针 first value是第一个成员 是 value safe 另请注意 由于对齐 无法保证大小