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

Duda con malloc / calloc

Estas en el tema de Duda con malloc / calloc en el foro de C/C++ en Foros del Web. Hola !! Estoy escribiendo un código que me permita introducir cadenas de caracteres en una estructura de forma dinámica. Para ello, utilizo punteros como campos ...
  #1 (permalink)  
Antiguo 23/05/2010, 12:35
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 15 años, 7 meses
Puntos: 6
Duda con malloc / calloc

Hola !!

Estoy escribiendo un código que me permita introducir cadenas de caracteres en una estructura de forma dinámica. Para ello, utilizo punteros como campos de la estructura y luego guardo en ellos las direcciones de las tablas de caracteres creadas con calloc. En la estructura también guardo la longitud del campo.

Lo que hago es que si por ejemplo, introduzco un tamaño de 4 caracteres, le sumo uno para colocar el carácter '\0' de fin de cadena al final. Y mi problema es que si coloco un tamaño total de 7 caracteres e introduzco la cadena "Baloncesto" (10 caracteres), no me produce ningún error, y teóricamente estoy escribiendo en una dirección de memoria que no me pertenece (un Core Dumped o Fallo de Segmentación).

Lo he probado muchas veces (para quitar la opción de "te ha tocado la ejecución con más memoria disponible", o algo parecido).
¿Alguien puede ayudarme y decirme porque no me da error? Aquí dejo el código.

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. // Definicion de la estructura
  6. struct info {
  7.   int  longitud;
  8.   char * nombre;
  9. };
  10. // Fin de la definicion
  11.  
  12.  
  13. int main()
  14. {
  15.  
  16.   int tamanio;  
  17.   struct info trama;
  18.  
  19.   // Solicito la longitud de la cadena  
  20.   printf("Longitud: ");
  21.   scanf("%d", &trama.longitud);
  22.   printf("Longitud en la estructura: %d\n", trama.longitud);
  23.  
  24.   // Creo una tabla llamada nombre con el tamanio de esa longitud +1 por el \0
  25.   tamanio = ((trama.longitud)+1) * sizeof(char);
  26.   printf("tamanio: %d\n", tamanio);
  27.  
  28.   trama.nombre = (char *) malloc(tamanio);  
  29.  
  30.   if(trama.nombre != NULL)
  31.     {
  32.      
  33.       // Coloco el '\0'
  34.       trama.nombre[tamanio] = '\0';
  35.      
  36.       printf("Nombre: ");
  37.       scanf("%s", trama.nombre);
  38.      
  39.      
  40.       printf("\nMUESTRO EL NOMBRE INTRODUCIDO\n");
  41.       printf("Nombre: %s\n", trama.nombre);
  42.       printf ("Longitud del nombre: %d caracteres\n", strlen(trama.nombre));
  43.      
  44.     }
  45.   else
  46.     {
  47.       printf("ERROR\n");
  48.       free(trama.nombre);
  49.     }
  50.   return 0;
  51. }


Por si es necesario, decir que programo con GNU Emacs 23.1.1 en Ubuntu Lucid con arquitectura de 32 bits.

Muchas gracias,
gonzo.
  #2 (permalink)  
Antiguo 23/05/2010, 13:48
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 15 años, 7 meses
Puntos: 6
Respuesta: Duda con malloc / calloc

Ya he descubierto el problema. Colocaba el '\0' antes de tiempo y en mal lugar. La línea 34 iría en la línea 38 y el contenido correcto es:

Código C:
Ver original
  1. trama.nombre[tamanio-1] = '\0';

Saludos,
gonzo

Etiquetas: malloc
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:04.