2017-04-05 1 views
1

Je ne suis pas sûr de savoir comment obtenir une chaîne à partir d'une adresse en C++.Comment obtenir une chaîne à partir d'une adresse?

Pretend c'est l'adresse: 0x00020348 Pretend cette adresse contient la valeur « délicieuse »

Comment puis-je obtenir la chaîne « délicieuse » du 0x00020348 d'adresse? Merci.

Répondre

1

Cette réponse est pour aider à élargir notre dialogue dans les commentaires.

S'il vous plaît voir le code suivant comme exemple:

#include <stdio.h> 
#include <string.h> 
#include <string> 

int main() 
{ 
    // Part 1 - Place some C-string in memory. 
    const char* const pszSomeString = "delicious"; 
    printf("SomeString = '%s' [%08p]\n", pszSomeString, pszSomeString); 

    // Part 2 - Suppose we need this in an int representation... 
    const int iIntVersionOfAddress = reinterpret_cast<int>(pszSomeString); 
    printf("IntVersionOfAddress = %d [%08X]\n", iIntVersionOfAddress, static_cast<unsigned int>(iIntVersionOfAddress)); 

    // Part 3 - Now bring it back as a C-string. 
    const char* const pszSomeStringAgain = reinterpret_cast<const char* const>(iIntVersionOfAddress); 
    printf("SomeString again = '%s' [%08p]\n", pszSomeStringAgain, pszSomeStringAgain); 

    // Part 4 - Represent the string as an std::string. 
    const std::string strSomeString(pszSomeStringAgain, strlen(pszSomeStringAgain)); 
    printf("SomeString as an std::string = '%s' [%08p]\n", strSomeString.c_str(), strSomeString.c_str()); 

    return 0; 
} 

Partie 1 - La variable pszSomeString devrait représenter la chaîne réelle en mémoire que vous essayez de rechercher (une valeur arbitraire, mais 0x00020348 pour l'amour de votre Exemple).

Partie 2 - Vous avez mentionné que vous stockez la valeur de pointeur comme int, donc iIntVersionOfAddress est une représentation entière du pointeur.

Partie 3 - Ensuite, nous prenons l'entier « pointeur » et restaurer un const char* const afin qu'il puisse être traité comme une chaîne de C à nouveau.

Partie 4 - Enfin, nous construisons un std::string en utilisant le pointeur C-string et la longueur de la chaîne. Vous n'avez pas réellement besoin de la longueur de la chaîne car le C-string est un caractère nul ('\0') -terminated, mais j'illustre cette forme du constructeur std::string dans le cas où vous devez calculer vous-même la longueur .

La sortie est la suivante:

SomeString = 'delicious' [0114C144] 
IntVersionOfAddress = 18137412 [0114C144] 
SomeString again = 'delicious' [0114C144] 
SomeString as an std::string = 'delicious' [0073FC64] 

Les adresses de pointeur varient, mais les trois premières valeurs de pointeur hexagonale sont les mêmes, comme on pouvait s'y attendre. Le nouveau tampon de chaîne construit pour la version std::string est une adresse complètement différente, également comme prévu.

Note finale - ne sachant rien de votre code, un void* serait normalement considéré comme une meilleure représentation d'un pointeur générique qu'un int.