Durch das große Array gehst du über den Stack Bereich hinaus und überschreibst verschiedene Speicheradressen deines Programmes, bis es abstürzt.
Eine Lösung ist, wie du es schon selbst weiß, den Heap zu benutzen. Das erreichst du durch das benutzen von malloc, sowie calloc.
Lösungen dazu finden man zu hauf im Internet, einfach mal nach Stichpunkten wie "2D array malloc" googeln. Immerhin hatte Leute schon vor Jahrzehnten das gleiche Problem wie du.