В случае, если вам интересно, почему он вообще компилируется, это потому, что scanf совершенно не типизирован, поскольку после первого аргумента он принимает список переменных параметров (...).
Это означает, что вы можете передать все, что захотите, и это будет просто "надежда на лучшее", то, что вы хотели.
Это должен быть указатель, но он откатит 4 или 8 байтов от стека, и все, что находится в нем, будет считаться указателем, и оно будет пытаться читать из него.
Учитывая, что это C ++ (вы использовали new, а не malloc), могу ли я предложить вам использовать библиотеку C ++ и не использовать scanf. Используйте вектор желательно, а не массивы. Используйте матричный класс, если вам нужна матрица, и вы можете использовать iostream или подобное для выполнения чтения входных данных.