for(;begin != end + 1; begin++)
W tym miejscu niepotrzebne są dwie rzeczy end + 1 oraz begin++. Powinieneś:
1) Użyć po prostu end. Wyrażenie + 1 jest tu błędne, gdyż tworzysz wskaźnik, który jest o dwa miejsca za ostatnim elementem tablicy. [UB]
2) Utworzyć osobny wskaźnik, do którego przypiszesz wartość z begin, z którego będziesz później korzystał do wypełnienia tablicy. W instrukcji return zwracasz wskaźnik begin + licznik, a ten wskazuje już na pamięć, która do Ciebie nie należy. [UB]