[C con Clase] CRC

Steven Richard Davidson stevenrichard.davidson en gmail.com
Sab Sep 1 07:50:20 CEST 2007


Hola Bernardo,

On 8/31/07, Bernardo Reyes <bernardo5304 en gmail.com> wrote:
> Hola , gracias por responder , pero el algoritmo esta bien :S LA
> funcion correr_izq no hace un corrimiento de bits , simplemente la uso
> para eliminar los ceros del principio de la cadena. Mira , este es mi

Me di cuenta de la intención de la función después de enviar mi
respuesta. También tienes razón en que tal algoritmo es correcto.
Pensé que no estabas copiando el carácter nulo a su nueva posición
para acortar la cadena, pero en realidad lo haces correctamente.

> nuevo codigo y ya sirvio , aunque tienes razon en que no deberia de
> regresar una variable local. Al reservar memoria con malloc no me
> marca error a pesar de que regrese una variable local ¿ porque es?

Esto es porque se retorna el valor de la variable local, no la
variable local en sí. En el caso del puntero, se retorna su valor: la
dirección de memoria adjudicada a través de 'malloc()'. Esta dirección
de memoria y su contenido existe globalmente. Por ejemplo,

int * func()
{
  int  *ptr = (int *) malloc( 100 * sizeof(int) );
  return ptr;
}

Como puedes ver retornamos el valor de 'ptr': la dirección de memoria
dada por 'malloc()'. Al finalizar la función 'func()', la variable
local 'ptr' es destruida, pero no antes de retornar su valor actual.
En este ejemplo podríamos eliminar la variable 'ptr':

int * func()
{
  return (int *) malloc( 100 * sizeof(int) );
}

> Ah y eso de agregar ficheros fuente je , pues si tienes razon debi
> hacer un .h pero solo lo hice asi rapido para no tener todo en main.
>

[CORTE]

>
> Ah y siempre se me olvida liberar memoria. Lo siento :-S
>

Debes tener cuidado con el tema de memoria. Personalmente, no soy muy
partidario de que las funciones adjudiquen memoria y luego pasa la
responsabilidad al programador para liberarla. Por ello, sugiero pasar
punteros válidos, apuntando a memoria ya creada y existente, como por
ejemplo arrays. Con esto el programador ve exactamente los requisitos.
Por ejemplo,

int main()
{
  int *pLista = (int *) malloc( 100 * sizeof(int) );

  func_lista( pLista, 100 );

  free( pLista );
  return 0;
}

Aquí, el programador es quien se responsabiliza de la adjudicación y
liberación de la memoria. Por cada 'malloc()' que el programador
invoque, existirá su complemento 'free()'. De esta manera, no hay
problemas de pérdida de memoria.


Espero haber aclarado las dudas.

Steven




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