Problema Incrementar puntero

Iniciado por x64core, 16 Junio 2012, 11:39 AM

0 Miembros y 1 Visitante están viendo este tema.

x64core

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

The Swash

#1
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.

david_BS

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.

Khronos14

Podrías hacer:


*Temp = (*Temp) + 2;


Saludos.

x64core


david_BS

Cita de: RHL en 16 Junio 2012, 19:19 PM
gracias a todos, los agradece

si querías incrementar el valor de un número sería como ya dijeron anteriormente:

int main()
{
int num = 6;
DWORD* p = (DWORD*)&num;
*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*)&num;
// 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