Подпись в массиве определяется в терминах арифметики указателей, и в стандарте C99 это можно сказать об арифметике указателей:
Если и операнд указателя, и
результат указывают на элементы
тот же объект массива, или один прошлый
последний элемент объекта массива,
оценка не должна давать
над потоком; в противном случае поведение
не определено.
Таким образом, доступ к Node->links[-1]
(даже просто получение адреса Node->links[-1]
), строго говоря, является неопределенным поведением. Таким образом, у вас нет гарантии, что Node->links[-1]
получит вас Node::data
.
Но, как отмечают многие комментаторы, это будет работать почти всегда. Я все еще считаю это плохой практикой программирования, которой следует избегать. Если не по техническим причинам, то потому, что это требует, чтобы изменения в struct Node
могли легко вызвать ошибки, с которыми компилятор вам не поможет. Когда кто-то добавляет что-то между data
и links
, все таинственным образом нарушается.