From this reference, In C it seems the following behavior is undefined.
int my_array[100][50];
int *p = my_array[0];
p[50]; // UB
Is there a reference in C++03 or C++11 which confirms this?
See Question&Answers more detail:osYes in the description of the + operator. You may not dereference that pointer in C because it is a past the end pointer for the first subarray. In C++ this currently is legal because the pointer points to a valid integer (the points to relation is defined somewhere in clause 3). However in both standards adding more than 50 yields undefined behavior.
A DR was recently sent to the c++ committee about the rule that dereferencing such "valid out of thin air" pointers may be dereferenced, so i would not rely on that.