/
Inicio :: Foros

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

malloc no genera error esperado

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
jabar



Registrado: 20 Ene 2014
Mensajes: 5

MensajePublicado: 22/01/2014 6:42 pm
Título: malloc no genera error esperado

Hola que tal a todos, estoy aprendiendo a usar la asignación de memoria dinámica en C, he realizado un pequeño código para ver como funciona esto, al parecer todo va bien excepto cuando modifico el código para que el compilador me de un error y poder ver los limites de la función malloc, el problema es que no me da error.

El error que espero es: Violación de segmento (`core' generado) o de ese tipo, el código es:

Código:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3
  4 int main(void)
  5 {
  6         int i;
  7         int *p1 = NULL;
  8
  9         p1 = (int*)malloc(5*sizeof(int)); //reservo 5 espacios de tipo entero   
 10
 11         if(p1 == NULL)printf("No se pudo asignar memoria\n");
 12
 13         for(i = 0 ; i <= 15 ; i++) // asigno 15 valores a un vector de 5 espacios
 14         {
 15                 *(p1+i) = (i+1);
 16                 printf("%d\n",*(p1+i));
 17         }
 18
 19 return 0;
 20 }


Como pueden ver, en la linea 9 reservo memoria dinámica para un vector de 5 elementos pero en la 13 introduzco 15 valores al mismo vector, por lo que espero que el compilador me arroje un error por violación de segmento, ya que según estoy escribiendo en un lugar indefinido ¿no?. La cosa es que compila sin error, la salida es una lista de números del 1 al 16.

Uso el compilador gcc en Ubuntu.


Otra cosa de la que me acabo de dar cuenta, olvide liberar la memoria, lo corregí, le puse free(p1) al final, compilo bien, pero cuando lo ejecuté me ah salido un lió de errores, algo como:

Código:

*** Error in `./malloc1': free(): invalid next size (fast): 0x0000000001484010 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x80996)[0x7f1fdcc87996]
./malloc1[0x40069e]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f1fdcc28de5]
./malloc1[0x400549]
======= Memory map: ========
00400000-00401000 r-xp 00000000 00:18 3410154                            /home/jaime/jabar/P/malloc/malloc1
00600000-00601000 r--p 00000000 00:18 3410154                            /home/jaime/jabar/P/malloc/malloc1


Muchas gracias por sus respuestas.
Volver arriba
dehm



Registrado: 29 Abr 2011
Mensajes: 143

MensajePublicado: 23/01/2014 2:16 am
Título:

Creo (y espero que alguien que sepa de verdad lo confirme o aclare las causas verdaderas) que no tienes error porque el compilador no analiza los errores que se pueden manifestar en tiempo de ejecución.

Sintácticamente tu código está bien, por lo que no genera errores de compilación.

Otra cosa es que luego, en ejecución, el puntero intente acceder a memoria no asignada previamente, por lo que puede pasar cualquier cosa.

Es como cuando defines un array con N elementos, y luego intentas acceder a un índice superior a N. No tendrás problema compilando, pero en la ejecución la cosa falla.

Igualmente, al intentar liberar memoria que "no es tuya" , ya que no la tenías asignada, el programa igualmente genera un error.
_________________
Aprendiendo
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
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