Как бы получить строку с адреса?

Я не уверен, как получить строку из адреса в 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 — Наконец, мы строим 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,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]