Ne C ne C++ controllano un eventuale sforamento dei limiti massimi dell'array, e cosa succede, quando avviene, ricade nel "comportamento indefinito" (undefined behaviour).

Da quello che so un array deve essere sempre definito con una costante. Anche se sia variabile (come nell'esempio sopra), si imposta a costante.
Corretto.
Perchè allora se compilo un programma con dimensione di array solamente definita come:
int dim;
int array[dim]
senza porre come costante la variabile dim, il programma mi si compila ed esegue lo stesso?
A mia vista si esegue correttamente. Perchè?
Perché è una porcheria introdotta nel gcc e poi ratificata nello standard ISO C99 che prevede i VLA ( variable length array ). A quanto ne so funziona solo su gcc e i vari porting, ma non su altri compilatori. Il C++ non prevede questa ciofeca e giustamente si rifiuta di compilare se gliela proponi. Attualmente, poi, DEVC++ è un insulto, non un compilatore.
Il mio consiglio è passare a VC++ Express o ( se non ti piace M$ ) a CodeBlocks ( di cui trovi vari porting).