Выражение имеет неопределенное поведение.
(Этот вопрос был закрыт как дубликат этого вопроса , но в нем обсуждаются только указатель + целочисленная арифметика c, а не указатель- арифметика указателя c, о которой спрашивает этот вопрос. Не стесняйтесь закрыть вопрос как дубликат, если существует существующий вопрос, который конкретно задает вопрос о вычитании указателя-указателя.)
N1570 является проект стандарта ISO C 2011 года. Раздел 6.5.6, параграф 9, в котором обсуждается вычитание, гласит:
Когда вычитаются два указателя, оба должны указывать на элементы одного и того же объекта массива или один после последнего элемента объекта массива; В результате получается разница индексов двух элементов массива.
(Один объект, не являющийся массивом, рассматривается как элемент массива из 1 элемента, но здесь он неприменим. )
Указатель, полученный выражением (char*)NULL
, не указывает ни на элемент объекта массива, ни на какой-либо другой объект (пункт 3 пункта 6.3.2.3), поэтому ((char *)NULL - (char *)NULL)
нарушает . Нарушение должно вне ограничения или ограничения во время выполнения приводит к неопределенному поведению (параграф 2 раздела 4).