Foros del Web » Programación para mayores de 30 ;) » C/C++ »

calloc y sus problemas

Estas en el tema de calloc y sus problemas en el foro de C/C++ en Foros del Web. hola acabo de terminar un programa y me gustaria que alguien me dijera por que funciona si añado una variable que llamo "nose" que no ...
  #1 (permalink)  
Antiguo 28/02/2010, 17:16
 
Fecha de Ingreso: febrero-2010
Mensajes: 3
Antigüedad: 14 años, 1 mes
Puntos: 0
calloc y sus problemas

hola acabo de terminar un programa y me gustaria que alguien me dijera por que funciona si añado una variable que llamo "nose" que no uso ni necesito para nada pero que si la quito el programa no funciona.


/* reves5.c */
/* una frase dada se escribe al revés la frase la teclea el usuario.
no sabemos lo que va a teclear por eso el usuario teclea la frase y luego haremos lo que se llama una reserva dinámica de memoria */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
int tam,i,nose;
char *frase,*otra; // puntero a zonas de memoria.

printf("Dame la frase\n\n");
scanf(" %[^\n]",otra);
tam=strlen(otra);
frase=(char*) calloc(tam,sizeof(char))
for (i=0;i<=tam;i++){
frase[i]=otra[i];}
printf("\nVoy a escribir la frase %s al reves\n\n",frase);

for(i=tam-1;i>=0;i--)// ponemos longitud-1 porque la primera celda se numera con cero.
{
printf("%c",frase[i]);
}
free(frase);
printf("\n\n");
system("PAUSE");
}
  #2 (permalink)  
Antiguo 28/02/2010, 17:39
Avatar de genuine_carlosV2  
Fecha de Ingreso: noviembre-2008
Ubicación: 127.0.0.1
Mensajes: 296
Antigüedad: 15 años, 5 meses
Puntos: 6
Respuesta: calloc y sus problemas

Ufff.... este programa está un poco bastante mal echo jeje

A ver, para almacenar un string, primero debes reservar memoria para ello, hacer esto es tener una violación de segmento asegurada:
Código C:
Ver original
  1. char *otra;
  2.  
  3. printf("Dame la frase\n\n");
  4. scanf("%s",otra);

Tienes que reservar memoria, por ejemplo: 'char otra[ 40 ];' ahora si puedes empezar a llenar el array 'otra' con caracteres (el 40 lo he puesto por poner. Reserva tanta memoria como creas).

Más cosas, en la linea 'frase=(char*) calloc(tam,sizeof(char))' le falta un punto y coma (;) final.

Si haces las cosas como te acabo de indicar, el programa funciona perfectamente.

Respondiendo a tu pregunta: Lo que te estaría sucediendo, seguramente, es que al añadir la variable 'nose', tendrías unos bytes extra para poner el texo y, por tanto, eso haría que no se produjese una violación de segmento. Sin esta variable, al escribir, estarías machacando instrucciones del programa y por eso no funcionaría. Si te interesa el tema y como solucionarlo, doy una explicación más detallada en este post.

P.D.: Para el siguiente post, por favor, usa el coloreado de sintaxis ya que así cuesta de entender el código

Saludos
__________________
Carlos

Recoger datos es solo el primer paso hacia la sabiduría. Pero compartir información es el primer paso hacia la comunidad. - IBM
  #3 (permalink)  
Antiguo 28/02/2010, 18:18
 
Fecha de Ingreso: febrero-2010
Mensajes: 3
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: calloc y sus problemas

gracias carlos por tu respuesta.
te comento:
el ; que falta es por un error teclear el usuarioe transcrpción, cosas del corta y pega y no revisa. Disculpas.
El objetivo de este programa es no gastar nada de memoria que no sea estrictamente imprescindible.
Lo que no quiero es inicializar otra porque no se el tamaño de la frase que va a r
  #4 (permalink)  
Antiguo 28/02/2010, 18:19
 
Fecha de Ingreso: febrero-2010
Mensajes: 3
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: calloc y sus problemas

--------------------------------------------------------------------------------
gracias carlos por tu respuesta.
te comento:
el ; que falta es por un error teclear el usuarioe transcrpción, cosas del corta y pega y no revisa. Disculpas.
El objetivo de este programa es no gastar nada de memoria que no sea estrictamente imprescindible.
Lo que no quiero es inicializar la variable "otra" porque no se el tamaño de la frase que va a teclear el usuario
  #5 (permalink)  
Antiguo 28/02/2010, 18:53
Avatar de genuine_carlosV2  
Fecha de Ingreso: noviembre-2008
Ubicación: 127.0.0.1
Mensajes: 296
Antigüedad: 15 años, 5 meses
Puntos: 6
Respuesta: calloc y sus problemas

Entonces pide la longitud de la cadena antes.

Puedes pedir la longitud de la cadena y con la longitud más 1 chars ya puedes pasar.

Saludos
__________________
Carlos

Recoger datos es solo el primer paso hacia la sabiduría. Pero compartir información es el primer paso hacia la comunidad. - IBM
  #6 (permalink)  
Antiguo 01/03/2010, 07:20
 
Fecha de Ingreso: febrero-2010
Mensajes: 39
Antigüedad: 14 años, 2 meses
Puntos: 0
Respuesta: calloc y sus problemas

también podrías crear tu propia función, por ejemplo, abres stdin, vas obteniendo cada char y creando el espacio necesario de forma dinámica hasta encontrar el '\n'

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:21.