Is an extra piece of memory allocated to the end of any array when their size is defined?
No. The context that you quoted is important. The exception that you bold is in reference to pointer arithmetic (and relations). It's saying that if you do pointer relations between pointers that do not point to members of the same array, then you get udb. However, there is a single exception to that, which is if either of the pointer are pointing to the first element past the end of the array.
If so, for what purpose?
null answer since it's presumes a false premise.
Is it to end the array with a null character?
No.
The reason for this is so that comparison to the end of the array is legal, that is, comparisons to &a[sizeof a] when a is an array. Note that &a[sizeof a] is the first element past the end of the array. If p is a pointer to an element of a or also the first element past the end of the array, then p can be compared to &a[sizeof a].
I quote from the C99 specification, section 6.5.8.5.
When two pointers are compared, the result depends on the relative locations in the address space of the objects pointed to. If two pointers to object or incomplete types both point to the same object, or both point one past the last element of the same array object, they compare equal. If the objects pointed to are members of the same aggregate object, pointers to structure members declared later compare greater than pointers to members declared earlier in the structure, and pointers to array elements with larger subscript values compare greater than pointers to elements of the same array with lower subscript values. If the expression P points to an element of an array object and the expression Q points to the last element of the same array object, the pointer expression Q + 1 compares greater than P. In all other cases, the behavior is undefined.