| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
Pantalàimon_
Registrado: 17 Jul 2007 Mensajes: 90
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |
 |
|
|