падать вроде и не должно. всем элементам массива указателей назначается адрес начала массива с даблами. соотв первый [2047] возьмёт указатель, второй сам дабл. правда смысла в массиве указателй на один и тот же адрес я не вижу.
при наличии этой строки падает
double gh[512][512];
|
делай так
double* gh = new double[512*512];