2 votes

notation bizarre des pointeurs en c

Quelqu'un peut-il m'expliquer pourquoi l'auteur initialise un pointeur void à un emplacement mémoire de cette manière. Je ne suis qu'un débutant et je n'ai jamais vu une telle notation auparavant.

void executeCode(){

char* MEMORY_BUFFER = (char*)VirtualAlloc(NULL, sizeof(someCode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);

memcpy(MEMORY_BUFFER, someCode, sizeof(someCode));

(*(void(*)())MEMORY_BUFFER)();
}

1voto

pmg Points 52636
char *MEMORY_BUFFER = /* whatever */;

MEMORY_BUFFER est un pointeur sur char. Vous ne pouvez pas "exécuter une chaîne".
Vous pouvez exécuter une fonction si vous disposez d'un pointeur sur celle-ci.

int (*fxptr)(void) = rand;
printf("%d\n", fxptr()); // execute rand() through the function pointer
printf("%d\n", (*fxptr)()); // dereferencing the function pointer is redundant

Les acteurs

(void(*)())MEMORY_BUFFER

"transforme" (s'il était valide) MEMORY_BUFFER à un pointeur sur une fonction prenant un nombre indéterminé d'arguments et ne renvoyant rien.
Vous pouvez appeler la fonction par l'intermédiaire de ce pointeur (en supposant qu'il soit valide)

    ((void(*)())MEMORY_BUFFER)();
    (*(void(*)())MEMORY_BUFFER)(); // no need to dereference function pointer

1voto

Eric Points 1308

Il semble que le casting de style c de MEMORY_BUFFER vers le pointeur d'une fonction renvoyant un vide (void(*)()) avec déréférencement et appel de fonction. Il serait bon de simplifier les choses comme dans le cas suivant

typedef fn_ptr void(*)();

(*(fn_ptr)MEMORY_BUFFER)();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X