auf der Plattform abhängig.
Für Windows können Sie diesen Code verwenden:
// 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);
Diese Codes nimmt eine myarr
Array als in Code Ihrer Frage ist, und es wird davon ausgegangen, dass sizeof
funktioniert auf es also eine direkt definierte Größe hat und nicht nur ein Zeiger von anderswo. Wenn das der Fall ist, müssten Sie die Größe auf andere Weise angeben.
Hinweis hier, dass es zwei „Vereinfachungen“ möglich, falls Sie sich fragen, aber ich würde davon abraten sie:
1) Sie VirtualAlloc
mit PAGE_EXECUTE_READWRITE
nennen könnte, aber dies ist im Allgemeinen schlechte Praxis, weil es würde Öffnen Sie einen Angriffsvektor für die Ausführung von unerwünschtem Code.
2) Sie VirtualProtect
auf &myarr
direkt anrufen können, aber das wäre nur eine zufällige Seite in Ihrem Gedächtnis machen, die Ihr Array ausführbare enthalten passiert, die dann 1 # noch schlimmer ist, weil es in dieser Seite andere Daten sein könnte als Nun, das ist jetzt auch plötzlich ausführbar.
Für Linux habe ich this auf Google gefunden, aber ich weiß nicht viel darüber.
Dies sieht aus wie ein [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Sagen Sie uns, welches Problem Sie lösen möchten, bevor Sie um Hilfe bitten, um es auf eine bestimmte Weise zu lösen. –
Ich möchte x86-Code in meinem Programm generieren, dann führen Sie es aus. –
Meinst du etwas wie [VirtualProtect] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa366898 (v = V.85) .aspx) in Windows? – Tomer