0 / 0 / 0
Регистрация: 13.05.2014
Сообщений: 29
1

Присвоение указателю адреса памяти, прописанного в стринге

08.05.2018, 00:35. Показов 3305. Ответов 6
Метки нет (Все метки)

Доброго времени суток!
Есть переменная стринг, содержащая адрес памяти. Как присвоить указателю данный адрес?
C++
1
2
3
4
5
6
7
8
9
10
11
12
string str = "0x00000000000851D4";
int * ptr = NULL;
// присваиваем
 
//??????
 
//***Проверка***
stringstream ss;
ss << &ptr;
cout << "0x" << ss.str() << endl;
//Вывод печати
0x00000000000851D4
Спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2018, 00:35
Ответы с готовыми решениями:

Присвоение адреса указателю, равному NULL
В конструкторе класса я присваиваю адрес переменной укзаателю,который равен был инициализирован...

Присвоение указателю на базовый класс адреса производного класса
Когда наследую как public,всё норм,как private - ошибка. Как сделать тогда,чтобы открылся...

Присвоение указателю члену класса нового адреса, ошибка компиляции
Идея в том, чтобы хранить в отдельном списке объекты типа B и передавать в объект типа A указатель...

Присваивание указателю адреса памяти
Имеется структура и указатель на неё. В указатель выделяется память следующим образом: pointer =...

6
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
08.05.2018, 10:25 2
Цитата Сообщение от VladK Посмотреть сообщение
Есть переменная стринг, содержащая адрес памяти. Как присвоить указателю данный адрес?
Сначала нужно разобраться: о чём речь? std::string не предназначен для хранения адресов.
Здесь str будет хранить копию строкового литерала (как реализовано хранение - зависит от реализации):
Цитата Сообщение от VladK Посмотреть сообщение
C++
1
string str = "0x00000000000851D4";
Адес копии можно вывести так:
C++
1
cout << (void*)str.c_str() << endl;
Если же ты строку хочешь перевести в адрес (число), то как-то так:
C++
1
2
3
4
5
6
    stringstream ss;
    ss << hex << str;
    long long int n;
    ss >> n;
    cout << "0x" << setw(16) << setfill('0') << hex << n << endl;
    //Вывод печати: 0x00000000000851D4
0
0 / 0 / 0
Регистрация: 13.05.2014
Сообщений: 29
08.05.2018, 23:16  [ТС] 3
Сначала нужно разобраться: о чём речь? std::string не предназначен для хранения адресов.
Здесь str будет хранить копию строкового литерала (как реализовано хранение - зависит от реализации):
Полностью согласен с свами, string не предназначен для хранения адресов !!!
Но беда в том, что я получаю массив адресов, через сокет, чтоб работать уже с загруженными данными.
0
4 / 4 / 3
Регистрация: 06.04.2017
Сообщений: 7
08.05.2018, 23:58 4
Лучший ответ Сообщение было отмечено VladK как решение

Решение

Если я правильно понял задачу, то возможно сделал бы так:
C++
1
2
auto ull = std::stoull(str, 0, 16);
int* p = reinterpret_cast<int*>(ull);
Правильность не гарантирую.
1
nd2
3431 / 2810 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
09.05.2018, 02:18 5
Цитата Сообщение от VladK Посмотреть сообщение
я получаю массив адресов
Адресов в виде чего?
0
1463 / 1005 / 455
Регистрация: 30.10.2017
Сообщений: 2,793
09.05.2018, 03:50 6
Лучший ответ Сообщение было отмечено VladK как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <string>
#include <sstream>
#include <cstdlib>
 
using namespace std;
 
int main()
{
    char a[] = "Test";
    stringstream ss;
    ss << "0x" << &a;
    cout << ss.str() << endl;
 
    unsigned long long l;
    ss >> hex >> l;
    char* ptr = (char*)l;
    cout << ptr << endl;
 
    system("pause");
    return 0;
}
1
0 / 0 / 0
Регистрация: 13.05.2014
Сообщений: 29
09.05.2018, 21:19  [ТС] 7
Tossey, Огромное спасибо, ни когда раньше не использовал _cast и это реально достоенное решение!!!

QuakerRUS, Отличное решение, спасибо. Но, как мне объяснили, что лучше использовать стандартизованные решения, каким является *_cast.

nd2, Ситуация такая, включается приложение сервера и загружает б/д связным списком и размером ~400 - 500 MB.
Далее включаются n клиентов и эти гады требуют ту или иную инфу из б/д. Учитывая то, что через сокет можно передать только char[], то адреса списков (классы) передаются через него.
Все траблы начинаются когда грузишь б/д > 50 MB. В процессе обработки вылетает:
Problem Event Name: APPCRASH
Exception Code: c0000005
Доктор Гугл говорит что это проблемы в памяти. Хотя если б/д ~ 25 MB то все работает без проблем.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.05.2018, 21:19
Помогаю со студенческими работами здесь

Присваивание указателю адреса области памяти в явном виде
Помогите пожалуйста) #include &quot;stdafx.h&quot; int _tmain(int argc, _TCHAR* argv) { unsigned...

Присвоение значения указателю
Как можно, вот так, присваивать указателю значение? Разве, указатель не должен всегда содержать...

Присвоение по указателю на 32 и 64 битных машинах
Добрый день. Скомпилированная программа на 64-битной машине аварийно завершается....

Присвоение значения указателю на функцию
Есть укзатель на функцию. Есть перегруженная функция. как присвоить указателю нужный нам вариант...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru