/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

sobre memoria dinamica

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 90

MensajePublicado: 16/09/2007 4:47 am
Título: sobre memoria dinamica

Hola, ¿sabéis porque este programa no me devuelve 10 en la pantalla?

Código:
#include<stdio.h>
#include<strings.h>

int main(void)
{
  int indice;
  char *cadena;
  cadena= (char *) malloc(10);
  scanf("%s",cadena);
  printf("%d",sizeof(cadena));
  return 0;
}


Gracias!
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 16/09/2007 5:24 am
Título:

Por que el operador sizeof sobre un puntero devuelve el tamaño de este no el tamaño del bloque donde apunta.
No ostante, el tamaño del bloque donde apunta cadena, es justo el valor constante que le indicas a malloc, es decir, 10 bytes.
Despues de la llamada a scanf puedes consultar la longitud de la cadena mediante strlen que siempre debería ser <=l a 9 + el cero nulo.


S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 90

MensajePublicado: 16/09/2007 7:03 am
Título:

¿Y cuanto ocupa guardar la direccion de un variable, es decir, el puntero? a mi me responde el programa que 4 bytes.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 16/09/2007 7:31 am
Título:

Pantalàimon_ escribió:
¿Y cuanto ocupa guardar la direccion de un variable, es decir, el puntero?

Ese es el valor que obtienes con "sizeof(p)" donde "p" es un puntero como en tu caso un "char *".

Pantalàimon_ escribió:
a mi me responde el programa que 4 bytes.

Lo usual, depende de la plataforma.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 90

MensajePublicado: 16/09/2007 1:45 pm
Título:

cheroky escribió:

Despues de la llamada a scanf puedes consultar la longitud de la cadena mediante strlen que siempre debería ser <=l a 9 + el cero nulo.


Lo he probado con el siguiente programa y nada, si escribo 15 caracteres me escribe 15.

Código:

#include<stdio.h>
#include<strings.h>

int main(void)
{
  int indice;
  char *cadena;
  cadena= (char *) malloc(10);
  scanf("%s",cadena);
  printf("%d",strlen(cadena));
  return 0;
}
Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 114
Ubicación: Argentina

MensajePublicado: 16/09/2007 2:31 pm
Título:

Cierto lo que dices , pero falta free(..), por lo tanto si pasas el valor definido en malloc(..), ingresando caracteres, free dará error:
Código:


int main(void)
{
   size_t t = 0;
   size_t tmem = 0;

   char *cadena;

   tmem = 10;

   cadena= (char *) malloc(tmem);
   cadena[tmem - 1]='\0';

   printf("memory size: %d\nIngresa hasta %d letras o free(..) fallará:\n",tmem,tmem-1);
   
   scanf("%s",cadena);
   t = strlen(cadena);

   printf("size strlen: %d\n",t);

   free(cadena);

   system("pause");
   return 0;

}

Saludos.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 16/09/2007 2:33 pm
Título:

Si en ese programa introduces mas de nueve caracteres (cortesia del mal uso de scanf) se produce comportamiento no definido, en buen cristiano el programa puede reventar, funcionar corectamente, etc.

Tienes que modificar la llamada a scanf para indicar la longitud maxima de la cadena (en realidad "palabra") y asi no sobrepasar la capacidad del bloque de memoria:
Código:
scanf("%9s", cadena);
printf("%lu", (unsigned long) strlen(cadena));


Nota de edicion: me refiero al programa de Pantalàimon_.

Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 16/09/2007 2:40 pm
Título:

Por eficiencia malloc internamente siempre reserva bloques fijos relativamente grandes o tambien probablemente escribas en direcciones del heap libres, obviamente es jugar con fuego y simpre deberas poner cuidado en no sobrepasar la memoria asignada para que el programa no reviente o sobrescribas direcciones invalidas.

S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 90

MensajePublicado: 16/09/2007 3:17 pm
Título:

En referencia a lo que has dicho, cheroky, parece ser cierto, aunque ponga 10 en malloc() el programa no me revienta hasta poner 16 caracteres. Así que supongo que reserva un memoria de 16 bytes por eso de ser 2^4.

Saludos
Volver arriba
Pantalàimon_



Registrado: 17 Jul 2007
Mensajes: 90

MensajePublicado: 16/09/2007 3:19 pm
Título:

No me hagas caso, ahora he puesto 5 en malloc y no me rebienta al poner 8 caracteres sino que he puesto hasta 19 caracteres y sigue tan pancho el programa.
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com