Buenas a todos vengo con este codigo curioso, estaba codeando y tenia problemas para acceder a los campos, mi logica me decia
una cosa XD, vean:
#include <Windows.h>
struct hola
{
DWORD a;
DWORD b;
DWORD* c;
};
hola jh;
int main()
{
jh.a = 10;
jh.b = 20;
DWORD* temp = &jh.b;
temp = (DWORD*) temp + 4;
return 0;
}
pero por ejemplo si el puntero temp lo quiero incrementar +2 como seria? ojo no quiero incremntar 2 posiciones sino simplemente sumarle 2...
intente hacerle un casting de char* pero no funciono :|
alguien sabe?
ED: ( 5 min despues XD ) si funciono con el casting de unsigned char* haha, siempre en la madrugada me salen estos pequeños errores, quiza e sueño XD
Hola,
Lo correcto sería:
Temp = (DWORD*)((int)Temp + 4);
Y digo lo correcto porque al menos así lo tengo entendido, lo que hace es convertir a entero para poder sumar como cualquier par de números y luego volver a hacer casting al tipo de puntero que es.
Con esto lo que harías sería incrementar la dirección del puntero pero si quieres incrementar su contenido deberás "desreferenciarlo".
*Temp = (*Temp) + 4;
Un saludo,
Iván Portilla.
hola por ahí este post te pueden ayudar
http://foro.elhacker.net/programacion_cc/tutorial_obtener_direccion_de_struct_dinamicamente-t358284.0.html
en cuanto el tipo de dato BYTE (unsigned char) es el que necesitás para incrementar de a un byte lógicamente, aunque el tipo puntero ya sabés que es de 4 bytes para el tipo que sea.
Podrías hacer:
*Temp = (*Temp) + 2;
Saludos.
gracias a todos, los agradece (http://s14.postimage.org/jw2owid3x/smiley.gif)
Cita de: RHL en 16 Junio 2012, 19:19 PM
gracias a todos, los agradece (http://s14.postimage.org/jw2owid3x/smiley.gif)
si querías incrementar el valor de un número sería como ya dijeron anteriormente:
int main()
{
int num = 6;
DWORD* p = (DWORD*)#
*p = (*p)+2;
printf("%x\n", p);
printf("%d\n", *p);
system("pause");
return 0;
}
pero yo había entendido que querías incrementar el puntero en dos bytes, lo cual sería algo así (se muestran ambos casos según el tipo de puntero) :
int main()
{
unsigned long num = 16;
DWORD* p = (DWORD*)#
// p = p+2;//-----------------------> incrementa 2*4 bytes = 8 bytes
printf("%x\n", p);
printf("%x\n", p+2);
printf("%d\n", *p);
unsigned char* a = (unsigned char*)p;
// a = a+2;//-----------------------> incrementa 2*1 byte = 2 bytes
printf("%x\n", a);
printf("%x\n", a+2);
printf("%d\n", *a);
unsigned long x = (unsigned long)*a;
printf("%d\n", x);
system("pause");
return 0;
}
igualmente ya se que lo habías resuelto haciendo un cast al tipo BYTE, pero pongo esta explicación para otras personas que tengan dudas