В C отлично сделать указатель, указывающий на один последний элемент массива и использовать его в арифметике указателя, если вы не разыщите его:
int a[5], *p = a+5, diff = p-a; // Well-defined
Однако это UB:
p = a+6;
int b = *(a+5), diff = p-a; // Dereferencing and pointer arithmetic
Теперь у меня есть вопрос: относится ли это к динамически распределенной памяти? Предположим, что я использую указатель, указывающий на одно из последних в арифметике указателя, без разыменования его, и malloc()
преуспевает.
int *a = malloc(5 * sizeof(*a));
assert(a != NULL, "Memory allocation failed");
// Question:
int *p = a+5;
int diff = p-a; // Use in pointer arithmetic?