是否保证C中的数组元素将连续存储,没有填充?

2024-01-08

换句话说:如果我有一个以这种方式分配的数组,是否可以保证:

void *arr = calloc(nmemb, sizeof(some_type))

Then elta, eltb, eltc都将指向内存中的同一位置,这将是 type 的第二个元素some_type这个数组的?

some_type *elta = &((some_type*)arr)[1];
some_type *eltb = ((some_type*)arr)+1;
some_type *eltc = (char*)arr+sizeof(some_type);

我问这个问题的原因是因为我正在尝试用 C 语言创建一个“容器”,如果这不成立,那么我就不知道如何返回指向第一个元素之外的任何其他元素的指针。


是的,这是有保证的。If添加填充字节,添加它们within struct some_type,但不在两个数组元素之间。

E. g.:

struct S
{
    int n;
    short s;

// this is just for illustration WHERE byte padding (typically) would occur!!!
#if BYTE_ALIGNMENT >= 4
    unsigned char : 0;
    unsigned char : 0;
#endif
};
struct S s[2];
size_t d = (char*)(s + 1) - (char*)s;

将字节对齐调整为 4 或 8(或什至更大的 2 的幂)时,该结构体的大小将为 8,并且 d 将等于 8,将字节对齐设置为 1 或 2 时,该结构体的大小将为 6床...

注意:这不是唯一可能出现填充字节的地方:如果您切换了成员n and s,之间需要填充字节s and n to get n正确对齐。另一方面,n 之后不再需要填充字节,因为结构大小已经确保了正确的对齐。

参照标准:C11,6.2.5.20:

数组类型描述了一个连续分配具有特定成员对象类型(称为元素类型)的非空对象集。 36) 数组类型的特征在于其元素类型和数组中元素的数量。 [...]

(由我突出显示!)。

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

是否保证C中的数组元素将连续存储,没有填充? 的相关文章

随机推荐

  • 自定义 ViewCell Xamarin Tableview C# 中的按钮

    再次期待您的帮助 我试图让最右侧的按钮能够删除表视图控件中的行 现在他们现在知道他们在哪一行 但我无法将此信息连接到父级 表视图中填充有自定义视单元 自定义视图单元格包含两个不同的选择器 两个输入字段和一个按钮 我还没有找到更干净的方法来执
  • NSFileManager 创建目录错误 518 NSFileWriteUnsupportedSchemeError

    我试图创建一个目录 NSError error nil NSString BIDirectory NSSearchPathForDirectoriesInDomains NSCachesDirectory NSUserDomainMask
  • Win32 - 从标准输入读取超时

    我正在尝试做一些我认为应该很简单的事情 从标准输入进行阻塞读取 但如果没有可用数据 则在指定的时间间隔后超时 在 Unix 世界中这很简单select 但这在 Windows 中不起作用 因为stdin不是插座 不创建额外线程等的下一个最简
  • 为我的第一个组件编写一个玩笑测试

    我刚刚写完第一篇Reactjs组件 我准备编写一些测试 我使用material ui s Table and Toggle 我读到jest and enzyme但我觉得我还缺少一些东西 我的组件如下所示 简化 export default
  • 拦截文件系统系统调用

    我正在编写一个应用程序 我需要拦截一些文件系统系统调用 例如 取消链接 我想保存一些文件 比如 abc txt 如果用户删除该文件 那么我需要将其复制到其他地方 所以我需要在删除 abc 之前取消链接来调用我的代码 以便我可以保存它 我已经
  • Xcode - 找不到架构 x86_64 的符号(iOS Lib)

    我正在构建一个静态库 构建设置将架构设置为 ARCHS STANDARD 显示为Standard Architectures armv7 armv7s arm64 我选择 iOS 设备构建库 然后使用模拟器 例如 iPhone Retina
  • 两个字符串的比较在android中不起作用[重复]

    这个问题在这里已经有答案了 这是我的代码 Eclipse 没有显示任何错误 程序工作正常 但它根本不完全符合我的要求 View image view danger rate ImageView findViewById R id origi
  • 如何模拟像 new Date() 这样的构造函数

    我有一个方法取决于new Date创建一个日期对象 然后对其进行操作 我正在测试操作是否按预期工作 因此我需要将返回日期与预期日期进行比较 为了做到这一点 我需要确保new Date在测试和正在测试的方法中返回相同的值 我怎样才能做到这一点
  • d3.js - 强制布局边界问题 V4

    目前我正在参与 FCC 的项目之一国家连续性 https www freecodecamp com challenges show national contiguity with a force directed graph 本质上 我能
  • StarDock 的 ModernMix 如何工作? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 今天我发现了StarDock的ModernMix 有了它我们可以在经典桌面上运行Windows 8现代应用程序 我们知道它是如何运作的
  • 对列表进行排序,其中某些值保持在固定位置

    我有一个字符串列表 我只想对满足特定条件的值进行排序 考虑这个清单 foo bar testa python java abc 我只想用一个对值进行排序a在他们中 结果应该是这样的 foo abc bar python java testa
  • 如何识别curl请求

    有没有办法在我的脚本中检测请求是来自普通的网络浏览器还是来自执行curl的某些脚本 我可以看到标头 并且可以区分 用户代理和其他几个标头 但在curl中可以设置假标头 所以我无法跟踪请求 请建议我如何识别curl或其他类似的非浏览器请求 捕
  • 如何在严格分层的架构中进行分层并促进模块化而不造成不必要的冗余? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已获准开始为我公司的代码库构建新架构的基础 这一举措的推动力是 我们的代码库已经有十多年的历史了 并且随着我们尝试扩展 终于突破了界
  • 使用 __VA_ARGS__ 定义字符串化宏时出错

    我一直在尝试在 C 中实现一个函数宏 在参数前面加上 DEBUG 并将其参数传递给 printf define DBG format printf DEBUG format n VA ARGS 这在 gcc 中给了我这个错误 src inc
  • 如何配置 DispatcherServlet 和 ContextLoaderListener 以便让位于 OpenViewInSessionFilter

    我在使用 spring 3 0 5 和 hibernate 3 6 1 时遇到了一些问题 在发现我需要一个OpenViewInSessionFilter在一篇帖子中堆栈溢出 https stackoverflow com questions
  • 根据应用于多列的单个条件对数据框进行子集化

    我浏览了该网站上现有的子集问答 但找不到我想要的内容 我想根据一个条件 例如 如果值低于 5 对数据框进行子集化 但是 我只想要所有列中的值都低于 5 的行 例如使用iris数据集 我想选择第 1 3 列的值均低于 5 的所有行 subda
  • 允许每个实例一个代理的最佳 Web 浏览器控件是什么?

    我正在制作一个多线程 workers 应用程序 每个线程都应该有自己的非 GUI Web 浏览器 用于导航到网页并将数据写入字段并单击按钮 我还需要每个网络浏览器都有它自己的代理 我尝试了经典的 Windows Forms WebBrows
  • View 的 getWidth() 和 getHeight() 返回 0

    我看过类似的问题并尝试了他们的解决方案 但它对我不起作用 我正在尝试阅读width of an imageView 但它正在返回0 这是代码 public class MainActivity extends Activity privat
  • Parse.com 相当于 Group By

    我一直在浏览解析论坛 我发现截至 2 年前还没有 SQL Group By 的等效项 我想知道这方面有什么进展吗 我有数千条记录 我需要按价值评级的降序下拉所有记录 然后按名称对它们进行分组 如果目前不可用 也许有人可以建议我可以做一些工作
  • 是否保证C中的数组元素将连续存储,没有填充?

    换句话说 如果我有一个以这种方式分配的数组 是否可以保证 void arr calloc nmemb sizeof some type Then elta eltb eltc都将指向内存中的同一位置 这将是 type 的第二个元素some