The expression has undefined behavior.
(This question had been closed as a duplicate of this question, but that only discusses pointer+integer arithmetic, not the pointer-pointer arithmetic that this question asks about. Feel free to close the question as a duplicate if there's an existing question that specifically asks about pointer-pointer subtraction.)
N1570 is a draft of the 2011 ISO C standard. Section 6.5.6 paragraph 9, discussing subtraction, says:
When two pointers are subtracted, both shall point to elements of the
same array object, or one past the last element of the array object;
the result is the difference of the subscripts of the two array
elements.
(A single non-array object is treated as an element of a 1-element array, but that doesn't apply here.)
The pointer yielded by the expression (char*)NULL
does not point to an element of an array object, or to any other object (6.3.2.3 paragraph 3), so ((char *)NULL - (char *)NULL)
violates the shall. Violation of a shall outside a constraint or runtime-constraint results in has undefined behavior (section 4 paragraph 2).