Duda direcciones de memoria C

Iniciado por dRak0, 18 Julio 2013, 15:46 PM

0 Miembros y 2 Visitantes están viendo este tema.

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: 0028FF04


Perfecto 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.

eferion

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.

Caster

Aprovecho este post para preguntar una cosa, que diferencia hay entre estas dos declaraciones:

int* ptrArray1;

int *ptrArray1;

eferion

son idénticas.

En c y c++ los espacios no son tenidos en cuenta ( salvo en las cadenas de caracteres )

Oblivi0n

Cita de: eferion en 18 Julio 2013, 15:53 PM
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.

Cita de: Caster en 18 Julio 2013, 15:55 PM
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.

Caster

Gracias a los dos por responder.

Saludos

eferion

Cita de: Oblivi0n en 18 Julio 2013, 16:04 PM
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.

0xDani

Cita de: Oblivi0n en 18 Julio 2013, 16:04 PM
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?
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

Cita de: 0xDani en 18 Julio 2013, 16:15 PM
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.

Oblivi0n