【问题标题】:What is the difference between a struct of the same datatype and an array?相同数据类型的结构和数组有什么区别?
【发布时间】:2017-07-28 02:30:08
【问题描述】:

如果我有一个仅由短无符号整数组成的结构,它将存储在相同大小的连续内存位置;如果我有一个短无符号整数数组,这同样适用。他们会有什么不同?是如何访问它们的吗?我知道通过使用指针来访问数组以引用数组的起始值,而数组运算符设置从该内存位置的偏移量,同样适用于结构或通过使用每个部分的内存位置访问的结构数据?

【问题讨论】:

  • 不同之处在于您不控制可能/可能不会添加到结构中的填充(不提供某些预处理器指令)。该数组只是 shortsx-number 个,struct 就是那个加上任何填充。
  • A struct 可以从函数中传递/返回。数组不能。
  • 那么假设我想从一个函数中传递一系列连续的内存位置而不进行填充,我该怎么办?
  • 传递一个包含数组的结构体。
  • 处理数组的常用方法是通过指向元素类型的指针。例如,操作unsigned short 数组的函数将接收unsigned short* 类型的参数,并添加指示数组中有多少元素的信息(可能是另一个参数)。

标签: c arrays pointers struct padding


【解决方案1】:

不,它们不必相同,而且很可能不是。

如果是结构成员,成员之间可以有填充。因此,不能保证连续的成员将驻留在连续的内存中。在这种情况下,根据实现,使用第一个元素的地址的指针运算可能work 有效,也可能无效。

引用C11 标准的相关部分,第 §6.7.2.1/p15 章,结构和联合说明符,

[..] 可能有未命名的 在结构对象内填充,但不在其开头。

第 6.5.3.4 章,sizeof 运算符,

[...] 当 应用于具有结构或联合类型的操作数,结果是总数 此类对象中的字节数,包括内部和尾随填充。

然而,在数组的情况下,所有成员都保证驻留在连续的内存中,并且指针算术是确定性的。

【讨论】:

  • "不,它们不必相同" -- 同意 "而且很可能,它们不是" -- 很可能它们 是。成员都是相同类型的结构很可能会连续分配它们。但是,如果编译器决定对结构施加比对其成员更严格的对齐方式,那么最后可能会有填充。
猜你喜欢
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 2011-07-07
  • 2014-06-17
  • 2011-11-17
  • 1970-01-01
相关资源
最近更新 更多