【问题标题】:Address of an array declared inside a new struct在新结构中声明的数组的地址
【发布时间】:2016-05-03 13:17:56
【问题描述】:

在这样的定义中

typedef struct 
{
    myType array[N];
} myStruct;

myStruct obj;

我可以一直假设([编辑]假设会发生正确的转换,这不是这里问题的重点[/编辑])

(&obj == &obj.array[0])

将返回 TRUE 还是我应该担心编译器会引入额外的填充来满足 myType 对齐要求?理论上这不应该发生,因为结构只有一个字段,但我对此并不完全确定。

【问题讨论】:

  • C 和 C++ 是 不同的 语言,比较会产生两种不同的类型。但是它们都没有一个名为 TRUE 的标准常量或宏。
  • 如果你想引用数组,我建议使用obj.array,如果你想引用数组中的第一个元素,我建议使用obj.array[0]。使用obj 访问数组对于外人来说会更难理解。
  • 不确定 C 但在 C++ 中,第一个成员变量之前不能有填充。
  • 即使是C,第一个成员变量之前也没有填充
  • &obj == &obj[0] 格式不正确(类型不匹配)。要么你在用伪代码说话,要么将两者都转换为 void * 进行比较。

标签: c++ c compilation


【解决方案1】:

使用正确的强制转换,这将始终返回 true。

来自C standard 的第 6.7.2.1 节:

13. 在结构对象中,非位域成员和位域所在的单元的地址增加 按照它们被声明的顺序。 指向结构的指针 适当转换的对象指向其初始成员(或 如果该成员是位域,则指向它所在的单元 驻留),反之亦然。 可能存在未命名的填充 结构对象,但不是在其开头。

【讨论】:

  • 感谢您通过 C 标准确认。还要感谢其他评论的人(至少仔细阅读的人:-)
【解决方案2】:

根据当前的 C++ 标准草案[class.mem] §20 (N4527),重点补充:

如果标准布局类对象有任何非静态数据成员,其地址与地址相同 它的第一个非静态数据成员。否则,其地址与其第一个基类的地址相同 子对象(如果有)。 [注意:因此在标准布局结构中可能存在未命名的填充 对象,但不是在其开头,这是实现适当对齐所必需的。 ——尾注]

myStruct 是否为标准布局,取决于myType 是否为标准布局。如果是,那么您的要求是由 c++ 标准保证的。

注意&obj&obj.array[0]的指针类型不相关,所以表达式在c++中是不合法的。

【讨论】:

    猜你喜欢
    • 2014-04-24
    • 2020-11-09
    • 2018-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多