[C con Clase] Duda acerca de array

Steven R. Davidson vze266ft en verizon.net
Vie Feb 8 05:04:23 CET 2008


Hola Miguel,

miguel wrote:
> Buenas tardes a todos, hace muchísimo que no manejo c y no sé si estoy 
> demasiado oxidado y lo que voy a preguntar es tonto, pero resulta que 
> hace poco me pidieron colaboración con un código y hubo algo que me 
> quedó dando vueltas, en resúmen el código era así:
> 
> typedef struct{
>         unsigned int elementos[MC];
>         int cardinal;
> }Tconjunto,*conjunto;
> 
> ....
> 
> void crear_conjunto(conjunto X)
> {
>      X  = NULL;
> }
> 
> ....
> 
> main()
> {
>     Tconjunto A;
>     crear_conjunto (&A);
> 
> ...
> 
> bueno, la cuestión es que al crear la variable A la crearon como una 
> variable, luego la pasaron por referencia y la apuntaron a null, esto 
> qué implicaciones tendría? acaso estaría perdiendo la dirección anterior 
> de manera que nunca podría liberarla? o el compilador lo haría 
> automáticamente?. por otro lado, al  apuntarlo a null, ¿se mantiene el 
> tamaño?, es decir, se puede acceder a las variables de la estructura?, o 
> se debe generar nuevamente con un new, sizeof, o algo similar?, en cuyo 
> caso, ¿hay que destruirlo? o cuando vuelve se mantiene la antigua 
> creación como Tconjunto? (supongo que habrá que destruirlo, pero no sé 
> qué destruiría realmente, ya que no es un apuntador sino una variable)
> 

Todas estas preguntas se contestan por sí solas cuando tengas claro un 
concepto: no existen referencias en C. Los datos SIEMPRE se pasan por 
copia (o por valor). Para emular el paso por referencia, en C, usamos 
punteros.

En tu caso, pasas la dirección de memoria de la variable 'A' copiándola 
al puntero 'X'. Ten presente que 'X' es una variable local. 
Descomponiendo el programa en sentencias para ver la lógica equivalente, 
obtenemos que,

Tconjunto A;
{
   conjunto X = &A;   // crear_conjunto (&A);
   X = NULL;
}    // 'X' ya no existe: su memoria es liberada
...  // Volvemos a 'main()'

Como puedes ver, la asignación de NULL a 'X' afecta solamente a 'X'.

Como regla general, la memoria que nosotros creemos dinámica y 
explícitamente recae sobre nosotros la responsabilidad de liberar esa 
memoria. Si el compilador es responsable de crear memoria 
(implícitamente), entonces es el compilador quien la liberará. No hay 
"mezcla" de responsabilidades.

En cuanto al efecto de reasignar 'X' a NULL, no podríamos acceder a 
miembros de la estructura porque el puntero es nulo. Seguramente, 
optaríamos por crear memoria dinámicamente y apuntada por 'X'. Así 
usaríamos 'X' para acceder a los miembros de la estructura.

> discúlpenme si es algo obvio, pero me quedó la dudita y ahora estoy 
> programando en java y toy olvidando el manejo de memoria dinámica.
> 

No pasa nada. A mí también me pasó hace años cuando me centré en 
aprender Java. Me costó un poco volver a C++.


Espero que todo esto aclare las dudas.

Steven






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