RE:Matriz, dimension por scanf
No entiendo muy bien cual es el problema. Ya te han contestado más abajo. El código que tu estas tratando de hacer funcionar, no puede hacerlo porque estás saltandote reglas de C. Una de ellas es que el tamaño de un array estático como el tuyo, debe ser una constante, es decir debe ser conocido en tiempo de compilación. Por eso, no puedes poner algo como:
void f() {
int variable;
int array[variable];
}
Pues el espacio para el array debe conocerse en tiempo de compilación para dejar hueco en la pila al empezar la función. Algunos compiladores (gcc), se saltan esta regla, y la cosa compila, por ejemplo en:
void main() {
int variable;
scanf("%d", &variable);
int miArray[variable];
}
Y lo que se hace es reservar el hueco en tiempo de ejecución, después de haber ejecutado el scanf.
Ahora bien: esto no es aconsejable, pues no es estandar: directamente en C no compilar porque no declaras todas las variables al principio de la función. Y en C++ compila, pero solo en gcc y familia.
Así que, para poder tener un array de tamaño no conocido en tiempo de compilación como es tu caso (pues depende de lo que introduzca el usuario), la mejor forma de hacerlo es usando 'new' o 'malloc', como ya te contestaron.
Espero que te sirva.