[C con Clase] Arrays delimitados por variables

Davidson, Steven srd4121 en njit.edu
Vie Nov 2 02:55:36 CET 2012


Hola César,

2012/11/1 cesar arias <sinatra435 en hotmail.com>:
>
> Hola, me gustaria saber si es correcta esta forma de inicializar el
> siguiente array:
>
> int m;
> int A[m];
>

Bueno, primeramente, el término "inicializar" no es el correcto. En
C/C++, la inicialización es la siguiente:

int a = 10;
int *ptr = &a;
double b[5] = { 1,2,3,4,5 };
float mat[20][20] = { {1,2,3,4,5} };

Básicamente, la inicialización es la forma especial de dar valores
iniciales a variables mientras las definimos. Como puedes ver, la
implementación de la inicialización es al agregar el símbolo = seguido
de los valores a inicializar.

En segundo lugar, no puedes definir un array con una cantidad variable
de elementos, porque el compilador es quien crea y maneja el array.
Por consiguiente, el compilador debe saber, obviamente durante la fase
de compilación, la cantidad exacta de elementos. Si quieres crear un
array dinámicamente, entonces usa 'new[]' para adjudicar memoria
durante la ejecución del programa; debes desadjudicar la memoria con
'delete[]'.

> Siempre he inicializad de esta forma para no desperdiciar memoria, pero al
> poner las siguientes sentencia en un programa:
>
> int nest, ncar=50, nnotas;
> char nombre[nest][ncar];
> float media=0, prom[nest], desv[nest], notas[nest][nnotas];
>
> este se detiene y sale un mensaje diciendo que dejó de funcinar.
>

Algunos compiladores extienden el estándar del lenguaje para aceptar
cantidades variables para definir un array. En general, o bien el
compilador te dará un error al intentar hacer esto, o bien lo permite,
pero realmente asigna la cantidad de 1 elemento; es decir, define este
array:

char nombre[1][1];

Obviamente, ves la razón del error en tiempo de ejecución, ya que
seguramente los índices que usas rebasen las cotas superiores de los
arrays.

> Pero al cambiar las variables por constantes, asi:
>
> int nest, ncar=50, nnotas;
> char nombre[50][50];
> float media=0, prom[50], desv[50], notas[50][50];
>
> si funciona, pero se desperdiciaria memoria, ¿No creen?
> ¿Es realmente importante esto (sobre la memoria desperdiciada)?
>

Se considera buena práctica no desperdiciar memoria, que al fin y al
cabo, es un recurso común y limitado. Si no te interesa que los arrays
ocupen 50 elementos como máximo, entonces como mencioné antes, puedes
crear arrays dinámicos con la cantidad de elementos que quieres,
durante la ejecución.

> Por otra parte tambien me he dado cuenta que
>
> int m;
> int *A[m]
>
> cuando m no tiene un valor definido no es correcto. ¿Por qué?
>

Esto sigue siendo el mismo caso que he explicado antes: no puedes
indicar una variable para una cantidad fija de elementos al definir un
array, porque el compilador es quien controla este array.


Espero haber aclarado las dudas.

Steven




Más información sobre la lista de distribución Cconclase