char buffer[6]=”hello”;
char *prt1=buffer -1; /* undefined behavior */
char *ptr2 = buffer +5; /*Ok, pointing to the ‘\0’ inside the array */
char *ptr3 = buffer +6; /* OK, pointing to just beyond */
char *ptr4 = buffer +7; /* undefined behavior */
char *ptr3 = buffer + 6 is valid, as we are allowed to legally point to one past the last array element until we dereference it .
Actually, Setting a pointer one past the last element of an array is allowed in C and C++.
Hence, setting to pointer after '\0' ends in an array is allowed for only one position .
Ex => char buffer[8] = "vijaycs"
so, buffer + 7 returns '\0' which is surely allowed .
and Setting a pointer to buffer + 8(one past the last array element) is also valid, until it is dereferenced like
buffer[8] or *(buffer + 8), as it is not legal to access the contents of an address outside the allocated memory for an array.
Hence, after this setting a pointer to buffer + 9 and onwards is undefined behaviour .
You can read more here => https://gcc.gnu.org/onlinedocs/libstdc++/manual/iterators.html