elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] ¿Por qué esto no desborda? Malloc
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] ¿Por qué esto no desborda? Malloc  (Leído 3,783 veces)
GGZ

Desconectado Desconectado

Mensajes: 144



Ver Perfil
[C] ¿Por qué esto no desborda? Malloc
« en: 2 Julio 2016, 11:30 am »

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main (void){
  5.  
  6.        int *a= malloc (sizeof (int) * 3);
  7.  
  8.        a[0]=1;
  9.        a[1]=2342;
  10.        a[2]=43;
  11.        a[3]=89;
  12.        a[4]=666;
  13.        a[5]=12312;
  14.        a[6]=43;
  15.        a[7]=89;
  16.        a[8]=666;
  17.        a[9]=12312;
  18.        a[10]=32;
  19.        a[11]=32;
  20.  
  21.        int i;
  22.        for (i=0; i<=11; i++)printf ("%d ",a[i]);
  23.        puts ("");
  24.  
  25.  
  26.        return 0;
  27. }

¿Por qué no desborda? si yo sólo pedí espacio para 3, estoy confundido.

Saludos!  :-\


« Última modificación: 2 Julio 2016, 11:33 am por nisteeklod » En línea

LET'S DO STUFF!!
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: [C] ¿Por qué esto no desborda? Malloc
« Respuesta #1 en: 2 Julio 2016, 11:43 am »

Cuando ejecutas un programa, las variables se asignan a una parte de la memoria, pero las variables no son lo único que se almacenan. También se almacena código que pertenece a tu programa. Al salirte del rango asignado es posible que modifiques parte de tu código y por lo tanto tengas errores inesperados, mas no se producen errores en el 100% de los casos. En programas más complejos es donde se suele complicar la cosa


En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
GGZ

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: [C] ¿Por qué esto no desborda? Malloc
« Respuesta #2 en: 2 Julio 2016, 11:49 am »

Buenisimo y era para eso ahora quiero preguntarte si lo que hice está bien:

http://codepad.org/WtFyTHpG
http://codepad.org/oxVtGb6q
http://codepad.org/AotiUB6K

MIrá en el primer link en la linea 50 para hacer el stack reverse, está bien pedida la memoria? O me pedí de más?

Yo hice pruebas y funciona a la perfección pero no estoy seguro si estoy pidiendo más memoria de la cuenta.

Saludos!
En línea

LET'S DO STUFF!!
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [C] ¿Por qué esto no desborda? Malloc
« Respuesta #3 en: 2 Julio 2016, 11:57 am »

Hola que tal como te lo comentan, es en programas mas complejos cuanfo falla.

Aun asi es buena idea no escribir en memoria no inicializada.

Que tal que si deblaras un variable b

Código
  1. int *b= malloc (sizeof (int) * 3);

justo despues de a, es posible que malloc los devuelva continuos y se sobreescriban los valores de b al sobre pasar el buffer de a

Imagina que es un arreglo de apuntadores o alguna cadena y esta es procesada por otra funcion donde hace un proceso tal que ocurre algun otro bug, o simplemente le cambias un File descriptor por otro yo que se, es ahi donde suelen estar algunos bugs.

Saludos
« Última modificación: 2 Julio 2016, 12:04 pm por AlbertoBSD » En línea

GGZ

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: [C] ¿Por qué esto no desborda? Malloc
« Respuesta #4 en: 2 Julio 2016, 12:10 pm »

Bueno, pero la pregunta ahora es hasta donde puedo escribir bien?
¿Hasta a[2] ?
En línea

LET'S DO STUFF!!
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [C] ¿Por qué esto no desborda? Malloc
« Respuesta #5 en: 2 Julio 2016, 12:14 pm »

Bueno, pero la pregunta ahora es hasta donde puedo escribir bien?
¿Hasta a[2] ?

Si hasta a[2] de hecho en tu código deberias de inicializar hasta size +1 en el primer malloc.

O modificar el if para que sea size -1

Saludos
En línea

GGZ

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: [C] ¿Por qué esto no desborda? Malloc
« Respuesta #6 en: 2 Julio 2016, 12:35 pm »

Código
  1. void astack_reverse (){
  2.  
  3.  int size=5;
  4.  int *pila = malloc (sizeof (int)*size);
  5.  int n_elems=0;
  6.  int i;
  7.  
  8.  // Guardo todos los datos en un arreglo.
  9.  while (head != NULL){
  10.    if (n_elems != size-1){
  11.      pila[n_elems++] = head->data;
  12.      head = head->next;
  13.    }else{
  14.      // ... Si se queda sin memoria
  15.      size+=2;
  16.      pila = realloc (pila, size*sizeof(int));
  17.      pila[n_elems++] = head->data;
  18.      head = head->next;
  19.    }
  20.  }
  21.  // Chau pila actual.
  22.  astack_destroy();
  23.  // Construyo la pila devuelta. Del último al primero.
  24.  for (i=0; i<n_elems; i++)astack_push(pila[i]);
  25.  free(pila);
  26.  
  27. }

¿Así entonces?
¿Por qué size+1? Si voy hasta size-1
En línea

LET'S DO STUFF!!
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: [C] ¿Por qué esto no desborda? Malloc
« Respuesta #7 en: 2 Julio 2016, 12:52 pm »

Tienes razon!! por un momento pense que habias puesto menor o igual que, acabo de volver a ver y veo que en realidad tenias distinto de...

Tu codigo esta bien  como lo tenias

Código
  1. if (n_elems != size){

aunque al tratarse de numeros deberia de ser

Código
  1. if (n_elems < size){

¿Te esta arrojando resultados erroneos tu programa?

Saludos!!

En línea

GGZ

Desconectado Desconectado

Mensajes: 144



Ver Perfil
Re: [C] ¿Por qué esto no desborda? Malloc
« Respuesta #8 en: 2 Julio 2016, 13:17 pm »

No debería ser hasta size -1?

Mira si yo en este ejemplo pedí malloc(sizeof(int)*3) y llego hasta a[2] en este caso debería hacer lo mismo
Pido size y llego hasta size-1

Lo loco es que funciona bien de las dos maneras, si ya me paso mucho ahí desborda.
Obviamente que es por lo que me dijste.
En línea

LET'S DO STUFF!!
BloodSharp


Desconectado Desconectado

Mensajes: 812


¡ Hiperfoco !


Ver Perfil WWW
Re: [C] ¿Por qué esto no desborda? Malloc
« Respuesta #9 en: 3 Julio 2016, 02:08 am »

Código
  1.    #include <stdio.h>
  2.    #include <stdlib.h>
  3.  
  4.    int main (void){
  5.  
  6.            int *a= malloc (sizeof (int) * 3);
  7.  
  8.            a[0]=1;
  9.            a[1]=2342;
  10.            a[2]=43;
  11.            a[3]=89;
  12.            a[4]=666;
  13.            a[5]=12312;
  14.            a[6]=43;
  15.            a[7]=89;
  16.            a[8]=666;
  17.            a[9]=12312;
  18.            a[10]=32;
  19.            a[11]=32;
  20.  
  21.            int i;
  22.            for (i=0; i<=11; i++)printf ("%d ",a[i]);
  23.            puts ("");
  24.  
  25.  
  26.            return 0;
  27.    }
  28. }

¿Por qué no desborda? si yo sólo pedí espacio para 3, estoy confundido.

Por que a es un puntero que al ser asignado con malloc este apunta hacia otra memoria virtual asignada por el SO conocida como heap(montón)... mientras que i es un valor almacenado en la stack(pila) actual del contexto en que se ejecuta... Ergo son 2 espacios de memoria diferentes y distantes, aún así cuidado porque podrías en esos casos modificar otra heaps(caso hipotético si tuvieras más de 1)


B#
« Última modificación: 3 Julio 2016, 02:11 am por BloodSharp » En línea



Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Malloc ... « 1 2 »
Programación C/C++
roser24 14 7,412 Último mensaje 5 Mayo 2010, 21:15 pm
por Akai
Ayuda con el uso de malloc
Programación C/C++
alexis33de 2 4,050 Último mensaje 21 Agosto 2010, 23:18 pm
por alexis33de
Malloc y array ??
Programación C/C++
<<<-Basura->>> 2 3,426 Último mensaje 4 Octubre 2011, 15:19 pm
por LearningSpanishProgrammer
El genoma de los mil dólares desborda a los científicos
Noticias
wolfbcn 1 1,690 Último mensaje 18 Enero 2012, 00:38 am
por B€T€B€
Big Data desborda a los gobiernos y, proporcionalmente, aumenta el riesgo de ...
Noticias
wolfbcn 0 1,245 Último mensaje 5 Mayo 2015, 02:12 am
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines