Я не уверен, как получить строку из адреса в C ++.
Притворись, что это адрес: 0x00020348
Притворяться, что этот адрес содержит значение «вкусно»
Как бы я получить строку «вкусно» с адреса 0x00020348?
Спасибо.
Этот ответ поможет расширить наш диалог в комментариях.
Пожалуйста, посмотрите следующий код в качестве примера:
#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 — Наконец, мы строим std::string
используя указатель C-строки и длину строки. Вам на самом деле не нужна длина строки, так как 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
,
Других решений пока нет …