@shikamarucb: la forma que crees que no se puede usar se llama array de longitud variable, y es aceptada desde C99:
El sistema intentará reservarte a*sizeof(int) bytes al momento y la liberará al finalizar el ambito de la variable. El punto en contra de este metodo es que no tienes ninguna forma de saber si el sistema pudo reservar la memoria solicitada, y el problema lo tienes cuando sin haber conseguido reservar memoria intentas trabajar con la variable y provocas un desbordamiento de pila.
Código C++:
Ver originalint a;
cin >> a;
int vec[a];//no puedes comprovar la reserva
vec[0] = 1;//si hubo un error en la reserva de memoria aqui petará la aplicacion
A causa de esto se recomienda usar el new para reservar memoria; en c++ tambien puedes usar malloc para reservar memoria para no-objetos (variables estandar).
Retormando el ejemplo que te puso @vangodp implemento la comprovacion de error en la reserva de memoria:
Código C++:
Ver original//con try-catch
try {
tabla = new int * [n];
}
catch (bad_alloc &e) {
//error
}
//con nothrow
if(!(tabla = new (nothrow) int * [n])) {
//error
}
La comprovacion de reserva tienes que hacerla para cada new, igual que al finalizar tienes que llamar a un delete para cada new.
Saludos
vosk