[C] ¿Por qué esto no desborda? Malloc

Iniciado por GGZ, 2 Julio 2016, 11:30 AM

0 Miembros y 1 Visitante están viendo este tema.

GGZ

#include <stdio.h>
#include <stdlib.h>

int main (void){

       int *a= malloc (sizeof (int) * 3);

       a[0]=1;
       a[1]=2342;
       a[2]=43;
       a[3]=89;
       a[4]=666;
       a[5]=12312;
       a[6]=43;
       a[7]=89;
       a[8]=666;
       a[9]=12312;
       a[10]=32;
       a[11]=32;

       int i;
       for (i=0; i<=11; i++)printf ("%d ",a[i]);
       puts ("");


       return 0;
}


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

Saludos!  :-\
LET'S DO STUFF!!

class_OpenGL

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

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

GGZ

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!
LET'S DO STUFF!!

AlbertoBSD

#3
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

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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

GGZ

Bueno, pero la pregunta ahora es hasta donde puedo escribir bien?
¿Hasta a[2] ?
LET'S DO STUFF!!

AlbertoBSD

Cita de: nisteeklod en  2 Julio 2016, 12:10 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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

GGZ

void astack_reverse (){

 int size=5;
 int *pila = malloc (sizeof (int)*size);
 int n_elems=0;
 int i;

 // Guardo todos los datos en un arreglo.
 while (head != NULL){
   if (n_elems != size-1){
     pila[n_elems++] = head->data;
     head = head->next;
   }else{
     // ... Si se queda sin memoria
     size+=2;
     pila = realloc (pila, size*sizeof(int));
     pila[n_elems++] = head->data;
     head = head->next;
   }
 }
 // Chau pila actual.
 astack_destroy();
 // Construyo la pila devuelta. Del último al primero.
 for (i=0; i<n_elems; i++)astack_push(pila[i]);
 free(pila);

}


¿Así entonces?
¿Por qué size+1? Si voy hasta size-1
LET'S DO STUFF!!

AlbertoBSD

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

if (n_elems != size){

aunque al tratarse de numeros deberia de ser

if (n_elems < size){

¿Te esta arrojando resultados erroneos tu programa?

Saludos!!

Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

GGZ

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.
LET'S DO STUFF!!

BloodSharp

#9
Cita de: nisteeklod en  2 Julio 2016, 11:30 AM
   #include <stdio.h>
   #include <stdlib.h>
   
   int main (void){
   
           int *a= malloc (sizeof (int) * 3);
   
           a[0]=1;
           a[1]=2342;
           a[2]=43;
           a[3]=89;
           a[4]=666;
           a[5]=12312;
           a[6]=43;
           a[7]=89;
           a[8]=666;
           a[9]=12312;
           a[10]=32;
           a[11]=32;
   
           int i;
           for (i=0; i<=11; i++)printf ("%d ",a[i]);
           puts ("");
   
   
           return 0;
   }
}


¿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#