[C con Clase] Problema extraño con memoria

vicente lozano vicentelozano en gmail.com
Mar Mayo 31 21:48:42 CEST 2011


Hola Samuel,

 En primer lugar, muchas gracias por responder.

 Es un ELEMENTO, pero ELEMENTO es un puntero generico (typedef void
*ELEMENTO;) de ahi el casting en el malloc (= (void *) malloc (tamano)).

 Creo que te referias a que si fuera un "no puntero" no tendria sentido el
malloc, pero como ves en este caso no es asi, si no lo decias por eso, yo
sigo sin ver el problema.

 Por cierto, en el caso que da el error, ELEMENTO son cadenas, es decir se
llamaria a la funcion:

  LISTA miLista;
  char* miCadena="0";

  crear_unitaria_copiando (&miLista, miCadena,
strlen(miCadena)*sizeof(char));

Un saludo


2011/5/31 Samuel Díaz García <samueldg en arcoscom.com>

> Chico:
>
> ¿Qué es el miembro "dato" de tu estructura "NODO"? ¿Un "ELEMENTO" o un
> "puntero a ELEMENTO"?
>
> Con eso creo que he respondido.
>
> Salu2
>
> vicente lozano escribió:
>
>> Hola buenas,
>> Estoy depurando un programa y me da un problema muy raro con la memoria.
>>
>> Hay una modulo listas.c que gestiona listas de elementos:
>>
>> typedef void *ELEMENTO;
>>
>> typedef struct nodo{
>> ELEMENTO dato; struct nodo *siguiente; } NODO, *pNODO;
>> typedef struct LISTA{
>> pNODO primero, ultimo; int elementos; } LISTA, *pLISTA;
>>
>> En el cual usando la funcion:
>>
>> /**********************************************************************/
>> void crear_unitaria_copiando (pLISTA pL, ELEMENTO e, int tamano)
>> /**********************************************************************/
>> {
>> pL->primero = (pNODO) malloc (sizeof (NODO)); pL->ultimo = pL->primero;
>> pL->primero->dato = (void *) malloc (tamano); memcpy (pL->primero->dato, e,
>> tamano); pL->primero->siguiente = NULL; pL->elementos = 1; printf("LISTAS:
>> Creada unitaria. %s->%s\n",e,pL->primero->dato);
>> }
>>
>>
>> Me da el siguiente problema:
>>
>> LISTAS: Creada unitaria. 0->0Sp
>>
>> Lo que pasamos como "e" es siempre una cadena "0", lo que a bajo nivel es
>> -> [0][\0] pero lo que almacena es: [0] **** [\0] siendo * un numero
>> aleatorio de caracteres aleatorios.
>>
>> Lo curioso es que esto solo ocurre en el primer uso de la funcion cuando
>> se usan elementos pequeños 1-10 caracteres, y si se usan cadenas mas largas
>> ocurre mas veces hasta que se estabiliza y funciona correctamente.
>>
>> Asumo que es un problema de que esta usando una zona de memoria extraña,
>> pero no entiendo porque.
>>
>> A ver si algun sabio me puede echar una mano, si necesitais mas
>> informacion decirmelo que no tengo ningun problema.
>>
>> Un saludo
>>
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Lista de correo Cconclase Cconclase en listas.conclase.net
>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>>
>
> --
>   Samuel Díaz García
>    Director Gerente
> ArcosCom Wireless, S.L.U.
>
> CIF: B11828068
> c/ Romero Gago, 19
> Arcos de la Frontera
> 11630 - Cadiz
>
> http://www.arcoscom.com
>
> mailto:samueldg en arcoscom.com
> msn: samueldg en arcoscom.com
>
> Móvil: 651 93 72 48
> Tlfn.: 956 70 13 15
> Fax:   956 70 34 83
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20110531/a142f051/attachment.html>


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