2017-08-18 5 views
3

J'essaie d'afficher l'adresse mémoire d'une fonction dans une MessageBox, mais elle ne l'affiche pas comme je le souhaite. Je veux passer une adresse de fonction d'une fonction de rappel à une autre fonction, donc j'ai essayé d'obtenir son adresse.Adresse d'affichage C++ d'une fonction dans un MessageBox

J'ai regardé this par exemple et essayé de le montrer dans un MessageBox d'abord à la place d'imprimer sur la console, avant de l'utiliser.

Comment je l'ai essayé:

char ** fun() 
{ 
    static char * z = (char*)"Merry Christmas :)"; 
    return &z; 
} 
int main() 
{ 
    char ** ptr = NULL; 

    char ** (*fun_ptr)(); //declaration of pointer to the function 
    fun_ptr = &fun; 

    ptr = fun(); 

    char C[256]; 

    snprintf(C, sizeof(C), "\n %s \n Address of function: [%p]", *ptr, fun_ptr); 
    MessageBoxA(nullptr, C, "Hello World!", MB_ICONINFORMATION); 

    snprintf(C, sizeof(C), "\n Address of first variable created in fun() = [%p]", (void*)ptr); 
    MessageBoxA(nullptr, C, "Hello World!", MB_ICONINFORMATION); 

    return 0; 
} 

Mais, ces MessageBoxes affichent un très grand nombre et ils semblent nuls. J'aime les afficher dans une boîte aux lettres exactement comme dans les exemples de sorties de la publication liée.

Merci à l'avance.

+2

la distribution dans '(char *) "Joyeux Noël :)"' est inutile et dangereuse parce que la chaîne littérale est déjà 'const char * ' –

+1

À quoi ressemble la valeur d'un pointeur de fonction? Je m'attendrais à un "très grand nombre". Que voulez-vous dire par «et ils semblent nuls», cela semble contredire «un très grand nombre». – Yunnosch

+1

* A quoi ressemble la valeur d'un pointeur de fonction? * Comme ceci: '0xxxxxxx'. :-) Et ** J'aime les afficher dans une boîte aux lettres exactement comme dans les exemples de sorties du poste. ** – Blueeyes789

Répondre

2

J'ai fait quelques changements dans le code pour le rendre plus c++ -y, et il semble maintenant travailler:

  1. J'utilise std::cout pour imprimer au lieu de snprintf. Je convertis une adresse de pointeur en std::string via le std::stringstream. Cela devrait fonctionner sans problème pour votre MessageBox. J'ai changé la signature de la fonction pour const char** pour éviter tout problème.

Code final:

#include <iostream> 
#include <sstream> 

const char** fun() 
{ 
    static const char* z = "Merry Christmas :)"; 
    return &z; 
} 
int main() 
{ 
    const char** (*fun_ptr)() = fun; 
    const char** ptr = fun(); 

    std::cout << "Address of function: [" << (void*)fun_ptr << "]" << std::endl; 
    std::cout << "Address of first variable created in fun() = [" << (void*)ptr << "]" << std::endl; 

    std::stringstream ss; 
    ss << (void*)fun_ptr; 
    std::cout << "Address as std::string = [" << ss.str() << "]" << std::endl; 

    return 0; 
} 

Sorties:

Address of function: [0x106621520] 
Address of first variable created in fun() = [0x1066261b0] 
Address as std::string = [0x106621520]