Autor
|
Tema: [C] ¿Por qué esto no desborda? Malloc (Leído 3,765 veces)
|
GGZ
Desconectado
Mensajes: 144
|
#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 ]); return 0; }
¿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
Mensajes: 437
Si usas Direct3D, no eres mi amigo :P
|
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
Mensajes: 144
|
Buenisimo y era para eso ahora quiero preguntarte si lo que hice está bien: http://codepad.org/WtFyTHpGhttp://codepad.org/oxVtGb6qhttp://codepad.org/AotiUB6KMIrá 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
Mensajes: 3.705
🏴 Libertad!!!!!
|
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
|
|
« Última modificación: 2 Julio 2016, 12:04 pm por AlbertoBSD »
|
En línea
|
|
|
|
GGZ
Desconectado
Mensajes: 144
|
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
Mensajes: 3.705
🏴 Libertad!!!!!
|
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
Mensajes: 144
|
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]); }
¿Así entonces? ¿Por qué size+1? Si voy hasta size-1
|
|
|
En línea
|
LET'S DO STUFF!!
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
|
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!!
|
|
|
En línea
|
|
|
|
GGZ
Desconectado
Mensajes: 144
|
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
Mensajes: 811
¡ Hiperfoco !
|
#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 ]); 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#
|
|
« Última modificación: 3 Julio 2016, 02:11 am por BloodSharp »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Malloc ...
« 1 2 »
Programación C/C++
|
roser24
|
14
|
7,371
|
5 Mayo 2010, 21:15 pm
por Akai
|
|
|
Ayuda con el uso de malloc
Programación C/C++
|
alexis33de
|
2
|
4,043
|
21 Agosto 2010, 23:18 pm
por alexis33de
|
|
|
Malloc y array ??
Programación C/C++
|
<<<-Basura->>>
|
2
|
3,413
|
4 Octubre 2011, 15:19 pm
por LearningSpanishProgrammer
|
|
|
El genoma de los mil dólares desborda a los científicos
Noticias
|
wolfbcn
|
1
|
1,673
|
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,216
|
5 Mayo 2015, 02:12 am
por wolfbcn
|
|