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

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda direcciones de memoria C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 Ir Abajo Respuesta Imprimir
Autor Tema: Duda direcciones de memoria C  (Leído 9,183 veces)
dRak0

Desconectado Desconectado

Mensajes: 234


Ver Perfil WWW
Duda direcciones de memoria C
« en: 18 Julio 2013, 15:46 pm »

Hola que tal , como les va , espero que bien. Bueno voy a la pregunta .
Tengo el siguiente codigo :
Código:
#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.


En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda direcciones de memoria C
« Respuesta #1 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.


En línea

Caster


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: Duda direcciones de memoria C
« Respuesta #2 en: 18 Julio 2013, 15:55 pm »

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

Código
  1. int* ptrArray1;

Código
  1. int *ptrArray1;
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda direcciones de memoria C
« Respuesta #3 en: 18 Julio 2013, 15:59 pm »

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 Desconectado

Mensajes: 392

Odio las ranas.


Ver Perfil
Re: Duda direcciones de memoria C
« Respuesta #4 en: 18 Julio 2013, 16:04 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.

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

Código
  1. int* ptrArray1;

Código
  1. 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


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: Duda direcciones de memoria C
« Respuesta #5 en: 18 Julio 2013, 16:07 pm »

Gracias a los dos por responder.

Saludos
En línea

eferion


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Duda direcciones de memoria C
« Respuesta #6 en: 18 Julio 2013, 16:14 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.
En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Duda direcciones de memoria C
« Respuesta #7 en: 18 Julio 2013, 16:15 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?
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


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: Duda direcciones de memoria C
« Respuesta #8 en: 18 Julio 2013, 16:17 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.
En línea

Oblivi0n


Desconectado Desconectado

Mensajes: 392

Odio las ranas.


Ver Perfil
Re: Duda direcciones de memoria C
« Respuesta #9 en: 18 Julio 2013, 16:27 pm »

Seriously? Puedes darme una referencia fidedigna en la que se indique esto?

http://stackoverflow.com/questions/12626929/pointer-c-declaration
En línea

Páginas: [1] 2 3 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines