Учитывая знание прототипа функции и ее адреса в памяти, можно ли вызвать эту функцию из другого процесса или некоторого фрагмента кода, который ничего не знает, кроме прототипа и адреса памяти? Если возможно, как вернуть возвращаемый тип в код?
Вызов функции через ее адрес в памяти в c/С++
Ответ 1
В современных операционных системах каждый процесс имеет свое собственное адресное пространство, и адреса действительны только в процессе. Если вы хотите выполнить код в каком-то другом процессе, вам нужно либо вставить общую библиотеку, либо прикрепить свою программу в качестве отладчика.
Как только вы находитесь в другом адресном пространстве программы, этот код вызывает функцию с произвольным адресом:
typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
Ответ 2
Да - вы описываете указатель на функцию. Вот простой пример:
int (*func)(void) = (int (*)(void))0x12345678;
int x = func();
Вероятно, он не будет работать между процессами - в большинстве операционных систем процессы не имеют доступа к каждой другой памяти.
Ответ 3
В большинстве OP каждый процесс имеет свою собственную память, поэтому вы не можете.
Пример кода: a.c:
#include <stdio.h>
int r() {return 2;}
int main() {
printf("%p\n",r);
while(1);
}
b.c:
#include <stdio.h>
int main() {
int a,(*b)();
scanf("%p",&b);
a=b();
printf("%d\n",a);
return 0;
}
это приведет к ошибке сегментации.
Ответ 4
Все предыдущие ответы хороши, но слишком долго;-):
int i = ((int (*)(void))0xdeadbeef)();
Ответ 5
Если вам нужен прямой вызов:
((void(*)(void))0x1234)();