C负数组索引

ura*_*ray 10 c c++ arrays indexing

这是我的结构:

struct Node {
    struct Node* data;
    struct Node* links[4];
}
Run Code Online (Sandbox Code Playgroud)

假设没有填充,Node->links[-1]确保指向Node::data

Oli*_*rth 17

不保证; 这是未定义的行为:

  • 编译器相关的结构填充
  • 标准仅定义0和长度(包括)之间的数组索引
  • 可能的严格别名违规

在实践中,你很可能最终指向data,但任何访问它的尝试都将导致UB.

  • @Oli Charlesworth:给我看*任何*C编译器,其中这个确切的东西不起作用.如果他将关于此结构的重叠指针传递给具有严格参数的函数,那么您对严格别名的注释可能适用,但我认为这根本不相似. (4认同)

Mic*_*urr 7

数组下标是根据指针算法定义的,C99标准对指针算法有这样的说法:

如果指针操作数和结果都指向同一个数组对象的元素,或者指向数组对象的最后一个元素,则评估不应产生溢出; 否则,行为未定义.

因此,严格来说,访问Node->links[-1](即使只是获取地址Node->links[-1])是未定义的行为.所以你无法保证Node->links[-1]会得到你Node::data.

但正如许多评论家所提到的那样,它几乎总能奏效.我仍然认为应该避免的编程习惯很差.如果不是为了技术性,那么因为它需要修改struct Node很容易导致编译器无法帮助你的错误.当有人将东西之间datalinks,事情会打破神秘.