que punteros puntero ejemplo dev declaracion cadenas aritmetica apuntadores c++ c function-call memory-address

punteros - Llamando una función a través de su dirección en memoria en c/c++



punteros en c (5)

Dado el conocimiento del prototipo de una función y su dirección en la memoria, ¿es posible llamar a esta función desde otro proceso o alguna pieza de código que no sepa nada más que el prototipo y la dirección de la memoria? Si es posible, ¿cómo se puede volver a manejar un tipo devuelto en el código?


Cuando necesites una llamada directa:

((void(*)(void))0x1234)();


En la mayoría de los OP, cada proceso tiene su propia memoria, por lo que no puede.

Código de muestra: ac:

#include <stdio.h> int r() {return 2;} int main() { printf("%p/n",r); while(1); }

antes de Cristo:

#include <stdio.h> int main() { int a,(*b)(); scanf("%p",&b); a=b(); printf("%d/n",a); return 0; }

esto consigue la falla de segmentación.


En los sistemas operativos modernos, cada proceso tiene su propio espacio de direcciones y las direcciones solo son válidas dentro de un proceso. Si desea ejecutar código en algún otro proceso, debe inyectar una biblioteca compartida o adjuntar su programa como un depurador .

Una vez que esté en el espacio de direcciones del otro programa, este código invoca una función en una dirección arbitraria :

typedef int func(void); func* f = (func*)0xdeadbeef; int i = f();


Sí, estás describiendo un puntero de función. Aquí hay un ejemplo simple;

int (*func)(void) = (int (*)(void))0x12345678; int x = func();

Probablemente no funcionará entre procesos: en la mayoría de los sistemas operativos, los procesos no tienen acceso a la memoria de los demás.


Todas las respuestas anteriores son agradables pero demasiado largas ;-):

int i = ((int (*)(void))0xdeadbeef)();