2017-04-05 137 views
1

我不確定如何從C++中的地址獲取字符串。如何從地址獲取字符串?

假裝這是地址:0x00020348 假裝這個地址存放值「美味」

如何我會得到從地址0x00020348字符串「好吃的」? 謝謝。

回答

1

這個答案是爲了幫助擴展我們在評論中的對話。

請參見下面的代碼爲例:

#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; 
} 

第1部分 - 變量pszSomeString應該代表你正試圖尋求(爲目的給出的任意值,但0x00020348內存真正串起例)。

第2部分 - 你提到,你是存儲指針值作爲int,所以iIntVersionOfAddress是指針的整數表示。

第3部分 - 然後我們取整數「指針」並將其恢復到const char* const,以便它可以再次視爲C字符串。

第4部分 - 最後我們使用C字符串指針和字符串的長度構造std::string。由於C字符串是空字符('\0') - 終止,因此您實際上並不需要字符串的長度,但是我要說明此形式的std::string構造函數,如果您必須自己邏輯地計算出長度。

輸出如下:

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

指針地址會有所不同,但前三個十六進制指針值是相同的,正如所預期的。爲std::string版本構建的新字符串緩衝區是完全不同的地址,也是預期的。

最後的注意事項 - 對代碼一無所知,void*通常會被認爲是比int更好的通用指針表示。