Ver Mensaje Individual
  #1 (permalink)  
Antiguo 23/05/2010, 12:35
gonzo13
 
Fecha de Ingreso: agosto-2008
Mensajes: 240
Antigüedad: 15 años, 8 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.