Autor
|
Tema: Duda direcciones de memoria C (Leído 10,034 veces)
|
dRak0
|
Hola que tal , como les va , espero que bien. Bueno voy a la pregunta . Tengo el siguiente codigo : #include <stdio.h>
main() { int i,array1[5]={0,1,2,3,4}; int* ptrArray1; ptrArray1=array1; for(i=0;i<5;i++) printf("\nDesplazamiento del puntero por el array %d.Direccion: %p",*(ptrArray1+i),(ptrArray1+i));
}
El resultado es : Desplazamiento del puntero por el array 0.Direccion: 0028FEF4 Desplazamiento del puntero por el array 1.Direccion: 0028FEF8 Desplazamiento del puntero por el array 2.Direccion: 0028FEFC Desplazamiento del puntero por el array 3.Direccion: 0028FF00 Desplazamiento del puntero por el array 4.Direccion: 0028FF04Perfecto el codigo funca bien todo , ahora , la pregunta. ¿Porque cada vez que corro este programa la direccion en memoria del primer elemento del array es la misma? (Al ser siempre la primera la misma , las otras son iguales xq son consecutivas a esta ). Gracias.
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Cuando tú ejecutas un programa el sistema operativo reserva memoria y se la asigna al programa para que pueda trabajar.
La memoria, como norma general, está paginada y/o segmentada. Básicamente esto quiere decir que está dividida en fragmentos.
El sistema operativo dispone de un algoritmo que elige, entre los disponibles, qué segmento de memoria va a asignar al programa... dicho algoritmo suponemos que es LTI ( lineal e invariante en el tiempo ), es decir, que a una misma entrada, en unas mismas condiciones, generará siempre la misma salida.
Por tanto, si tu ejecutas varias veces seguidas tu programa sucederá lo siguiente:
Ejecutas el programa ( 1ª vez ) El sistema operativo reserva un fragmento de memoria y se lo asigna. El programa te muestra los desplazamientos. El programa finaliza y el fragmento de memoria es liberado. Ejecutas el programa ( 2ª vez ) El sistema operativo, te asigna el mismo fragmento de memoria. El programa te muestra los desplazamientos. El programa finaliza y el fragmento de memoria es liberado. ...
Si quieres tener resultados diferentes prueba a poner una pausa en el programa, lo ejecutas una vez y, sin cerrarlo, lo vuelves a ejecutar. Verás como entonces sí te cambian las posiciones de memoria.
|
|
|
En línea
|
|
|
|
Caster
|
Aprovecho este post para preguntar una cosa, que diferencia hay entre estas dos declaraciones: int* ptrArray1;
int *ptrArray1;
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
son idénticas.
En c y c++ los espacios no son tenidos en cuenta ( salvo en las cadenas de caracteres )
|
|
|
En línea
|
|
|
|
Oblivi0n
Desconectado
Mensajes: 392
Odio las ranas.
|
Cuando tú ejecutas un programa el sistema operativo reserva memoria y se la asigna al programa para que pueda trabajar.
La memoria, como norma general, está paginada y/o segmentada. Básicamente esto quiere decir que está dividida en fragmentos.
El sistema operativo dispone de un algoritmo que elige, entre los disponibles, qué segmento de memoria va a asignar al programa... dicho algoritmo suponemos que es LTI ( lineal e invariante en el tiempo ), es decir, que a una misma entrada, en unas mismas condiciones, generará siempre la misma salida.
Por tanto, si tu ejecutas varias veces seguidas tu programa sucederá lo siguiente:
Ejecutas el programa ( 1ª vez ) El sistema operativo reserva un fragmento de memoria y se lo asigna. El programa te muestra los desplazamientos. El programa finaliza y el fragmento de memoria es liberado. Ejecutas el programa ( 2ª vez ) El sistema operativo, te asigna el mismo fragmento de memoria. El programa te muestra los desplazamientos. El programa finaliza y el fragmento de memoria es liberado. ...
Si quieres tener resultados diferentes prueba a poner una pausa en el programa, lo ejecutas una vez y, sin cerrarlo, lo vuelves a ejecutar. Verás como entonces sí te cambian las posiciones de memoria.
No es exactamente así. El programa siempre muestra las mismas direcciones de memoria porque las direcciones que estas mostrando son direcciones virtuales (asignadas en tiempo de compilación). Si tu ejecutas 2 veces el programa, no se te asignara 2 veces el mismo bloque (si es muy seguido si, cumpliendo el principio de localidad). Las direcciones virtuales son traducidas luego por la MMU a direcciones físicas. Aprovecho este post para preguntar una cosa, que diferencia hay entre estas dos declaraciones: int* ptrArray1;
int *ptrArray1;
Fijate: Si hacemos int* ptr1,ptr2,ptr3; entonces ptr1,ptr2 y ptr3 son punteros a un entero. Si hacemos int *ptr1,ptr2,ptr3; entonces solo ptr1 es un punterom. El resto son variables enteras.
|
|
|
En línea
|
|
|
|
Caster
|
Gracias a los dos por responder.
Saludos
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Si hacemos int* ptr1,ptr2,ptr3; entonces ptr1,ptr2 y ptr3 son punteros a un entero. Si hacemos int *ptr1,ptr2,ptr3; entonces solo ptr1 es un punterom. El resto son variables enteras.
Ese es un ejemplo claro de cosas que no hay que hacer a la hora de programar Que luego baila algún espacio y podemos sudar tinta hasta dar con el fallo.
|
|
|
En línea
|
|
|
|
0xDani
Desconectado
Mensajes: 1.077
|
Si hacemos int* ptr1,ptr2,ptr3; entonces ptr1,ptr2 y ptr3 son punteros a un entero. Si hacemos int *ptr1,ptr2,ptr3; entonces solo ptr1 es un punterom. El resto son variables enteras.
Seriously? Puedes darme una referencia fidedigna en la que se indique esto?
|
|
|
En línea
|
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!
I code for $$$ Hago trabajos en C/C++ Contactar por PM
|
|
|
Caster
|
Seriously? Puedes darme una referencia fidedigna en la que se indique esto?
Que tiene de malo el ejemplo que me ha puesto Oblivi0n, yo no le veo el fallo, tiene sentido.
|
|
|
En línea
|
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[duda] Struc en C/C++, direcciones en memoria
Programación C/C++
|
CSQCasimiro
|
4
|
2,847
|
6 Septiembre 2012, 22:26 pm
por CSQCasimiro
|
|
|
Direcciones de memoria
Programación C/C++
|
Maik33
|
4
|
2,846
|
17 Octubre 2012, 14:48 pm
por Maik33
|
|
|
[Duda]Como resuelve el PE Loader direcciones de memoria en secciones ejecutables
Programación C/C++
|
BloodSharp
|
2
|
2,613
|
24 Septiembre 2014, 19:46 pm
por BloodSharp
|
|
|
Acceder a direcciones de memoria fuera de mi programa. Ensamblador y C
Hacking
|
dvpuchades
|
2
|
3,687
|
16 Diciembre 2014, 19:30 pm
por dvpuchades
|
|
|
Algun crypter que modifique las direcciones de memoria ?
« 1 2 »
Ingeniería Inversa
|
TrashAmbishion
|
14
|
9,255
|
16 Julio 2016, 04:24 am
por TrashAmbishion
|
|