duda sobre los punteros
Hola, tengo una duda sobre los punteros. Tengo 3 variables entereas con 3 n煤meros y quiero asignar mediante punteros una direcci贸n exacta por ejemplo, 3005, es decir que en esta direcci贸n se quede mi valor (bueno antes tengo que decir que despu茅s de declarar las 3 variables, declaro 3 punteros iguales, y con ellos tengo que asignar la direcci贸n de memoria exacta a los datos de las variables.
Gracias
Gracias
Hola, lo siento pero no puedes hacer tal cosa... Los sistemas operativos actuales son multitarea, y para evitar que unos procesos "contaminen" a otros el SO da a cada programa un espacio en memoria que ser谩 s贸lo suyo, en el momento en que un programa intenta acceder a una posici贸n de memoria que no le pertenece, el SO lo interrumpe y genera un mensaje de error (una excepci贸n)... el t铆pico de windows es "Unhandled exception in programa.exe 0xxxxxx Access violation".
Pues eso, que tu programa a violado la protecci贸n de acceso a memoria de los programas, ha intentado acceder a una posici贸n que no era suya... Prueba lo siguiente:
int *a;
a=0x3000;
printf("%d",*a);
Ver谩s que te aparece ese mensaje, pues esa direcci贸n seguramente no te pertenece (ser铆a muy raro que casualmente fuera tuya...).
Cada vez que declaras una vble en tu programa, el SO le da una direcci贸n en memoria, y tu puedes acceder a ella, ahora bien esa direcci贸n es est谩tica, no se puede variar. Si lo que quieres es guardar espacio en memoria lo puedes hacer mediante malloc(), pero esta funci贸n s贸lo te permite guardar un espacio de memoria que te asignar谩 el SO, no le puedes dar t煤 una direcci贸n cualquiera.
Esto es bastante l贸gico, pongamos el caso de que estas escribiendo algo en el word, y al mismo tiempo tu programa lee de un fichero, y el SO te deja que esa informaci贸n leida resida en la posici贸n de memoria que mas te guste. Podr铆a darse el caso de que casualmente esa posici贸n sea usada por el word para guardar el texto que est谩s escribiendo, al modificar esa informaci贸n, estar铆as variando el contenido del word sin darte cuenta... Imagina lo que podr铆a pasar con programas m谩s importantes para el sistema...
Al margen de toda esta charla decirte que para conocer la posici贸n de memoria de una vble lo puedes hacer de la sigte forma:
int a,b,c, *pa,*pb,*pc;
...
a=100;
b=200;
c=300;
pa=&a;//puntero_a contendr谩 la direcci贸n de a.
pb=&b;//puntero_a contendr谩 la direcci贸n de b.
pc=&c//puntero_a contendr谩 la direcci贸n de c.
...
ahora bien recuerda que en el momento en que pa,pb o pc apunten a otro sitio te saldr谩 el m铆tico mensajito (muy conocido por los programadores...)
Para conocer la posici贸n de memoria de estos punteros puedes hacer lo sigte:
printf("%d %d %d",pa,pb,pc);//en decimal
o
printf("%x %x %x",pa,pb,pc);//en hexadecimal
y para conocer el contenido de esas posiciones:
printf("%d %d %d",*pa,*pb,*pc);
Seguramente sean posiciones correlativas con una diferencia de 4 (4 bytes por int), esto se debe a que normalmente las vbles tienen direcciones consecutivas, porque se crearon de manera consecutiva. Aunque no creas que esas direcciones son las aut茅nticas, esas direcciones son f谩ciles de usar por el programador pero no tienen porque ser las verdaderas direcciones de memoria (la direccion exacta dentro de la RAM)... Existe un mecanismo de paginaci贸n... Piensa que si creas un array de 1000 posiciones estas ser谩n consecutivas dentro de tu programa, pero puede que en tu RAM no haya tantas posiciones consecutivas libres, por tanto las direcciones que tu crees correlativas no lo son en RAM.
Pero ese es ya otro tema y estoy cansado de escribir...
Si tienes alguna otra duda ya sabes... Siento la chapa...
Un saludo.
Pues eso, que tu programa a violado la protecci贸n de acceso a memoria de los programas, ha intentado acceder a una posici贸n que no era suya... Prueba lo siguiente:
int *a;
a=0x3000;
printf("%d",*a);
Ver谩s que te aparece ese mensaje, pues esa direcci贸n seguramente no te pertenece (ser铆a muy raro que casualmente fuera tuya...).
Cada vez que declaras una vble en tu programa, el SO le da una direcci贸n en memoria, y tu puedes acceder a ella, ahora bien esa direcci贸n es est谩tica, no se puede variar. Si lo que quieres es guardar espacio en memoria lo puedes hacer mediante malloc(), pero esta funci贸n s贸lo te permite guardar un espacio de memoria que te asignar谩 el SO, no le puedes dar t煤 una direcci贸n cualquiera.
Esto es bastante l贸gico, pongamos el caso de que estas escribiendo algo en el word, y al mismo tiempo tu programa lee de un fichero, y el SO te deja que esa informaci贸n leida resida en la posici贸n de memoria que mas te guste. Podr铆a darse el caso de que casualmente esa posici贸n sea usada por el word para guardar el texto que est谩s escribiendo, al modificar esa informaci贸n, estar铆as variando el contenido del word sin darte cuenta... Imagina lo que podr铆a pasar con programas m谩s importantes para el sistema...
Al margen de toda esta charla decirte que para conocer la posici贸n de memoria de una vble lo puedes hacer de la sigte forma:
int a,b,c, *pa,*pb,*pc;
...
a=100;
b=200;
c=300;
pa=&a;//puntero_a contendr谩 la direcci贸n de a.
pb=&b;//puntero_a contendr谩 la direcci贸n de b.
pc=&c//puntero_a contendr谩 la direcci贸n de c.
...
ahora bien recuerda que en el momento en que pa,pb o pc apunten a otro sitio te saldr谩 el m铆tico mensajito (muy conocido por los programadores...)
Para conocer la posici贸n de memoria de estos punteros puedes hacer lo sigte:
printf("%d %d %d",pa,pb,pc);//en decimal
o
printf("%x %x %x",pa,pb,pc);//en hexadecimal
y para conocer el contenido de esas posiciones:
printf("%d %d %d",*pa,*pb,*pc);
Seguramente sean posiciones correlativas con una diferencia de 4 (4 bytes por int), esto se debe a que normalmente las vbles tienen direcciones consecutivas, porque se crearon de manera consecutiva. Aunque no creas que esas direcciones son las aut茅nticas, esas direcciones son f谩ciles de usar por el programador pero no tienen porque ser las verdaderas direcciones de memoria (la direccion exacta dentro de la RAM)... Existe un mecanismo de paginaci贸n... Piensa que si creas un array de 1000 posiciones estas ser谩n consecutivas dentro de tu programa, pero puede que en tu RAM no haya tantas posiciones consecutivas libres, por tanto las direcciones que tu crees correlativas no lo son en RAM.
Pero ese es ya otro tema y estoy cansado de escribir...
Si tienes alguna otra duda ya sabes... Siento la chapa...
Un saludo.
Estoy de acuerdo con que asignar una direcci贸n espec铆fica de memoria a una variable es "peligroso", siempre que no sepamos con certeza que esa posici贸n no est谩 siendo ocupada por alguna parte de nuestro propio programa que no queremos sobreescribir. Aunque "por principio", el C++ no impide hacerlo, ya que se supone que el programador sabe lo que hace, y que puede estar programando alg煤n dispositivo que necesite alg煤n valor en alg煤n lado y no en otro.
Por ejemplo, al compilar y ejecutar este programita:
#include <cstdio>
int main()
{
char* p = reinterpret_cast<char*>(0x30000);
printf("p apunta a %pn", static_cast<void*>(p));
*p = 'a';
printf("*p = %cn", *p);
}
En mi m谩quina se lee:
p apunta a 00030000
*p = a
Alejandro
Por ejemplo, al compilar y ejecutar este programita:
#include <cstdio>
int main()
{
char* p = reinterpret_cast<char*>(0x30000);
printf("p apunta a %pn", static_cast<void*>(p));
*p = 'a';
printf("*p = %cn", *p);
}
En mi m谩quina se lee:
p apunta a 00030000
*p = a
Alejandro
No debes asignar a los punteros direcciones de memoria a lo loco, a no ser que est茅s tramando algo chungo.
Date cuenta de que entre t煤 y la memoria est谩 el sistema operativo (S.O.) que gestiona la memoria. Lo que intentas hacer es equivalente a que fueses a un edificio e intentases meter a una familia en casa de otro o en una casa vac铆a por el morro. Tienes que contar con el gerente del bloque (el S.O.) para hacer esto.
Puedes encontrar m谩s informaci贸n sobre punteros, referencias, operadores de punteros y reserva de memoria en el "Manual Imprescindible de C/C++" de Anaya Multimedia. Ah铆 viene todo eso muy claro y explicado con muchos dibujos para que te des una idea de c贸mo va el tema.
Un saludo.
Date cuenta de que entre t煤 y la memoria est谩 el sistema operativo (S.O.) que gestiona la memoria. Lo que intentas hacer es equivalente a que fueses a un edificio e intentases meter a una familia en casa de otro o en una casa vac铆a por el morro. Tienes que contar con el gerente del bloque (el S.O.) para hacer esto.
Puedes encontrar m谩s informaci贸n sobre punteros, referencias, operadores de punteros y reserva de memoria en el "Manual Imprescindible de C/C++" de Anaya Multimedia. Ah铆 viene todo eso muy claro y explicado con muchos dibujos para que te des una idea de c贸mo va el tema.
Un saludo.