Coś bardzo dziwnego zrobiłeś z wtymi pętlami (while i zagnieżdzony for). Nie wiem po co to jest, ale aktualnie wygląda to tak:
dla każdego elementu tablicy p, jeśli ten element jest nieparzysty, zapełniasz nim całą tablice wynikową.
Powinno być tak:
i=0
j=0
dla i-tego elementu tablicy oryginalnej:
jeśli i-ty element jest nieparzysty:
wpisz go do j-tego elementu tablicy wynikowej
j++
i++
Teoretycznie możesz zrobić tak jak teraz jeśli chodzi o alokacje tablicy wynikowej - tzn. tworzysz tablicę która na pewno zmieści wszystkie liczby nieparzyste [1]. Ale możesz też najpierw policzyć ilość elementów parzystych, a potem alokuj tablicę wynikową i (kolejna pętla) wpisuj do tablicy wynikowej. Jeśli okaże się, że już po policzeniu wychodzi, że nie ma elementów nieparzystych, to zwracasz NULL/nullptr.
[1] - skoro zakładamy, że `k` wskazuje na ostatni element tablicy (a nie za tablice) (a widzę, ze tak jest bo masz warunek while(p<=k)), to ilość wszystkich liczb wynosi k-p+1. W C++ jednak przyjmuje się, że koniec/end oznacza "za tablicą" a nie "ostatni element". Ja tylko mówię, że obecnie źle liczysz rozmiar.
Podpowiedź: zanim bawić się w inkrementowanie tego wskaźnika p, policz sobie rozmiar tej tablicy i do kolejnych elementów dostawaj się za pomocą operatora [ ]. Przejrzyściej i prościej ;)
const int sz = k-p+1; // +1 zakladajac ze k wskazuje na ostatni element a nie za niego
for (int i = 0; i < sz; ++i)
std::cout << p[i]; // cos tam sobie robisz z tą tablicą
Odnośnie
Wynikiem funkcji jest adres nowo utworzonej tablicy a rozmiar tej tablicy należy zwrócić przez dodatkowy parametr funkcji.
Powinno to wyglądać tak:
int* newTab(const int *p, const int *k, int *rozmiar)
{
//...
//...
*rozmiar = r; // r przechowuje rozmiar tablicy wynikowej obliczony wewnątrz funkcji. Obecnie masz parameter i zmienną lokalną nazwaną identycznie - rozmiar
return nieparzysta;
}
Dodatkowo `p` oraz `k` zmieniłem typ na `const int*`. Tzn., że nie można modyfikować pamięci na którą wskazuje. IMO powinienes tak zrobić, żeby pokazać, że funkcja na pewno nie modyfikuje danych wejściowych.