Зависит от платформы.
Для Windows, вы можете использовать этот код:
// Allocate some memory as readable+writable
// TODO: Check return value for error
LPVOID memPtr = VirtualAlloc(NULL, sizeof(myarr), MEM_COMMIT, PAGE_READWRITE);
// Copy data
memcpy(memPtr, myarr, sizeof(myarr);
// Change memory protection to readable+executable
// Again, TODO: Error checking
DWORD oldProtection; // Not used but required for the function
VirtualProtect(memPtr, sizeof(myarr), PAGE_EXECUTE_READ, &oldProtection);
// Assign and call the function
(void (*)()) myfunc = (void (*)()) memPtr;
myfunc();
// Free the memory
VirtualFree(memPtr, 0, MEM_RELEASE);
Этот код предполагает myarr
массив, как в коде вашего вопроса, и это предполагает, что sizeof
будет работать на него, то есть он имеет непосредственно определенный размер и не только указатель переходил из другого места. Если это так, вам придется указывать размер по-другому.
Обратите внимание, что здесь есть два «упрощений» возможно, в случае, если вам интересно, но я бы не советовал им:
1) Вы могли бы назвать VirtualAlloc
с PAGE_EXECUTE_READWRITE
, но это в общем плохой практикой, потому что это было бы откройте вектор атаки для нежелательного вывода кода.
2) Вы могли бы назвать VirtualProtect
на &myarr
непосредственно, но это было бы просто сделать случайную страницу в вашей памяти, которая происходит, чтобы содержать свой исполняемый файл массива, который еще хуже # 1, потому что может быть и другие данные на этой странице, как хорошо, что теперь тоже неожиданно выполнимо.
Для Linux я нашел this в Google, но я мало знаю об этом.
Это выглядит как [проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Расскажите нам, какую проблему вы пытаетесь решить, прежде чем просить о помощи, чтобы решить ее определенным образом. –
Я хотел бы сгенерировать x86-код в моей программе, а затем запустить его. –
Вы имеете в виду что-то вроде [VirtualProtect] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa366898 (v = vs.85) .aspx) в Windows? – Tomer