Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 5.00
sly4ainaya
2 / 2 / 0
Регистрация: 11.03.2011
Сообщений: 49
#1

Доступ к памяти по адресу - C++

29.07.2013, 13:31. Просмотров 1964. Ответов 42
Метки нет (Все метки)

Есть структура, элементы которой адрес на начало массива в памяти и его размер. Адреса хранятся в 16-ричном формате. Мне нужно распечатать то, что лежит в этом массиве.

C++
1
2
3
4
for (int i = 0; i <= ((int)(current->_size)); i++)
            {
                TraceFile << (current->_address)[i]<<endl;
            }
(current->_address)[i] - некорректно, не могу придумать, как сделать иначе
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2013, 13:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Доступ к памяти по адресу (C++):

Доступ к произвольному адресу памяти - C++
Есть известный адрес в памяти с известным значением int Хотел бы проверить это значение после того как введу адрес памяти вручную. ...

Доступ к переменной по абсолютному адресу. - C++
Мне нужно обратится к ячейке памяти с известным конкретным адресом (это может быть вектор прерывания, переменная БИОС итд). Как это сделать...

Прочитать из памяти по адресу - C++
Задача: в памяти по адресу 0040:0010h (0x00400010) записано слово (информация о подключенном оборудовании). Нужно прочитать 12-й бит этого...

Данные по адресу памяти - C++
У меня есть адрес например 0x11E9B62C как узнать что по нему записанно?

Выделение памяти по известному адресу - C++
Всем привет. Вопрос сообственно в заголовке темы. Как выделить память по нужному мне адресу, например: Я хочу выделить память n*...

Взятие обьекта по адресу в памяти - C++
Допустим, я знаю что по адресу 0x13242341 находится произвольный обьект. Как возвратить указатель типа void на данный адрес Типо так?...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.07.2013, 14:46 #31
Может необходимо сначала заполнить это пространство памяти полезной инфой ?) или Вы, забыли разименовать и выводятся адреса
1
xanderfomin
40 / 37 / 8
Регистрация: 25.10.2012
Сообщений: 112
29.07.2013, 14:48 #32
Kuzia domovenok, WAT?!
1) Адрес не может иметь тип int*. Адрес - это число. У нас тут 64-битная машина с Windows, значит, адреса представляются в виде long long. Если адрес имеет тип int*, то к нему надо прибавлять никак не 1, а sizeof(int).
2) Ничего странного здесь нет, как я уже говорил.
1
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
29.07.2013, 14:52 #33
Цитата Сообщение от xanderfomin Посмотреть сообщение
1) Адрес не может иметь тип int*. Адрес - это число. У нас тут 64-битная машина с Windows, значит, адреса представляются в виде long long. Если адрес имеет тип int*, то к нему надо прибавлять никак не 1, а sizeof(int).
и чего? просто не надо хранить адреса в виде этого твоего long long
"У нас тут 64-битная машина" Что уже? А где купить? Может всё-таки win32?

Добавлено через 1 минуту
Цитата Сообщение от xanderfomin Посмотреть сообщение
Если адрес имеет тип int*, то к нему надо прибавлять никак не 1, а sizeof(int).
бред. Сам проверишь или как?
1
aLarman
29.07.2013, 14:52
  #34

Не по теме:

а разве когда делаешь сборку под х64, адреса не становятся 8ми байтными?

0
sly4ainaya
2 / 2 / 0
Регистрация: 11.03.2011
Сообщений: 49
29.07.2013, 14:53  [ТС] #35
но у меня адрес long long, я не хочу менять
а sizeof ( double) не прибавляется

Добавлено через 34 секунды
как все сложно..
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
29.07.2013, 14:56 #36
Цитата Сообщение от aLarman Посмотреть сообщение
а разве когда делаешь сборку под х64, адреса не становятся 8ми байтными?
разумеется. Но если в коде не превращать указатели в unsigned int или unsigned long long или прочей привязке типов, то от платформы никакой разницы не будет

Добавлено через 34 секунды
Цитата Сообщение от sly4ainaya Посмотреть сообщение
а sizeof ( double) не прибавляется
никаких sizeof прибавлять не нужно это бред
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.07.2013, 14:56 #37
sly4ainaya, у Вас, в памяти хранится long long, сделав к указателю +1, вы сместитесь к следущему элементу, т.е на 8байт по памяти зачем пытаться прибавить sizeof(double)
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
29.07.2013, 14:57 #38
Цитата Сообщение от xanderfomin Посмотреть сообщение
Если адрес имеет тип int*, то к нему надо прибавлять никак не 1, а sizeof(int).
да ладно?
C++
1
2
3
4
5
6
7
    int* ptr=NULL;
    ptr++;
    cout<<ptr<<endl;
 
    ptr=NULL;
    ptr+=4;
    cout<<ptr;
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.07.2013, 14:58 #39

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
разумеется. Но если в коде не превращать указатели в unsigned int или unsigned long long или прочей привязке типов, то от платформы никакой разницы не будет
ну разумеется их надо хранить там где они уместится должны



Добавлено через 1 минуту

Не по теме:

Цитата Сообщение от xanderfomin Посмотреть сообщение
Если адрес имеет тип int*, то к нему надо прибавлять никак не 1, а sizeof(int).
помоему вам необходим раздел "Арифметика указателей"

2
xanderfomin
40 / 37 / 8
Регистрация: 25.10.2012
Сообщений: 112
29.07.2013, 15:04 #40
Kuzia domovenok, OK, виноват, сам неправильно выразился.
Если к T* прибавить 1 - перейдём к следующему элементу типа T.
Чтобы перейти к адресу следующего элемента типа T относительно текущего адреса типа long long, надо прибавить sizeof(T).

Добавлено через 2 минуты
aLarman, да нет, с адресной арифметикой всё в порядке, спасибо.
Тут уже просто пошла путаница между адресами и указателями.
0
aLarman
29.07.2013, 15:23
  #41

Не по теме:

Цитата Сообщение от xanderfomin Посмотреть сообщение
Тут уже просто пошла путаница между адресами и указателями.
угу

0
sly4ainaya
2 / 2 / 0
Регистрация: 11.03.2011
Сообщений: 49
30.07.2013, 11:11  [ТС] #42
Да, всем спасибо Вывод в конечном счете выглядит так

C++
1
2
3
4
5
6
7
8
9
for (int i = 0; i <= ((int)(current->_size)); i++)
            {
                std::stringstream ss;
                float fl = *((float*)(current->_address + i) );
                ss<<fl;
                std::string tmp(ss.str());
                TraceFile << tmp <<endl;
 
            }
0
zybrzybr
17 / 16 / 0
Регистрация: 29.09.2010
Сообщений: 156
30.07.2013, 11:41 #43
Цитата Сообщение от sly4ainaya Посмотреть сообщение
Да, всем спасибо Вывод в конечном счете выглядит так

C++
1
2
3
4
5
6
7
8
9
for (int i = 0; i <= ((int)(current->_size)); i++)
            {
                std::stringstream ss;
                float fl = *((float*)(current->_address + i) );
                ss<<fl;
                std::string tmp(ss.str());
                TraceFile << tmp <<endl;
 
            }
а зачем к указателю приводить что бы потом его разыменовывать?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2013, 11:41
Привет! Вот еще темы с ответами:

Почему обращение к недоступному адресу в памяти - C++
Почему при проверке кода(компиляции) выскакивает сообщение :&quot;Недостаточный размер массивов или обращение по недоступному адресу в памяти&quot; ?...

Вызов функции-члена класса по адресу в памяти - C++
Всем хорошего дня :) Допустим, что где-то есть static функция, не принимающая аргументов и ничего не возвращающая. Имея один лишь...

Как сделать массив в памяти по фиксированному адресу? - C++
Есть микропроцессор, и в нем по жестко зафиксированному адресу находится массив ячеек. Допустим типа int. Как в Си мне организовать к нему...

Вызвано исключение по адресу 0x0FD466CB (ucrtbased.dll). Динамическое выделение памяти - C++
Проблема в динамическом выделении памяти. Функция multiply доходит до возвращения объекта и вылетает исключение. Если функция вернет просто...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.07.2013, 11:41
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru