Стандарт допускает реализации на платформах, где память разделена на отдельные области, которые не могут быть достигнуты друг от друга с помощью арифметики указателей.В качестве простого примера, некоторые платформы используют 24-битные адреса, которые состоят из 8-битного номера банка и 16-битного адреса в банке.Добавление одного к адресу, который идентифицирует последний байт банка, даст указатель на первый байт этого того же самого банка, а не первый байт следующего банка.Этот подход позволяет вычислять адресную арифметику и смещения с использованием 16-битной математики, а не 24-битной математики, но требует, чтобы ни один объект не выходил за границы банка.Такая конструкция наложит некоторую дополнительную сложность на malloc
и, вероятно, приведет к большей фрагментации памяти, чем в противном случае, но пользовательскому коду обычно не нужно заботиться о разделении памяти на банки.
Многие платформы не имеют таких архитектурных ограничений, а некоторые компиляторы, которые предназначены для низкоуровневого программирования на таких платформах, позволяют выполнять адресную арифметику между произвольными указателями.Стандарт отмечает, что распространенным способом лечения неопределенного поведения является «поведение во время перевода или выполнения программы документированным образом, характерным для среды», и поддержка обобщенной арифметики указателей в средах, поддерживающих его, хорошо вписывается в эту категорию.К сожалению, в стандарте не предусмотрены какие-либо средства для разграничения реализаций, которые ведут себя таким полезным образом, и тех, которые этого не делают.