Zobrazujmy tablicę dwuwymiarową jako macierz/szachownicę. U Ciebie wygląda to tak: w funkcji zwroc_tablice chcesz zapewnić tablicy wymiary w na 3 (powiedzmy szerokość na wysokość), jednak podczas alokacji tablic tablic w linijkce trzynastej próbujesz dostać się do zakresu dwukrotnie większego k równego 2*w (czyli miejsca do którego nie mamy dostępu), aby zaaklować każdej z tych tablic 3 komórki. W dodatku w zagnieżdżonych pętlach próbujesz przypisywać wartości z zakresu w na k.
Wniosek: Wystarczy zadbać o właściwe wymiary przy alokowaniu pamięci oraz przechodzeniu po tablicy.
Przykładowa wersja o rozmiarze k na w:
int** zwroc_tablice (int *w) {
int **y;
int k = 2**w;
y = new int *[k];
for (int i = 0; i < k; i++)
y[i] = new int [*w];
for (int i = 0; i < k; i++) {
for (int j = 0; j < *w; j++) {
y[i][j] = i;
cout << y[i][j];
}
}
return y;
}