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

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

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

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

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

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

C++
1
2
3
4
for (int i = 0; i <= ((int)(current->_size)); i++)
            {
                TraceFile << (current->_address)[i]<<endl;
            }
(current->_address)[i] - некорректно, не могу придумать, как сделать иначе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zybrzybr
17 / 16 / 0
Регистрация: 29.09.2010
Сообщений: 156
29.07.2013, 14:37     Доступ к памяти по адресу #21
current->_address++;
это адрес +1 но не свиг указателя на sizeof(..)
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
29.07.2013, 14:37     Доступ к памяти по адресу #22
Цитата Сообщение от sly4ainaya Посмотреть сообщение
vars = (F_TYPE *)malloc(size);
кстати, это тоже неверно!
здесь надо
C++
1
vars = (int*)malloc(size*sizeof(int));
sly4ainaya
2 / 2 / 0
Регистрация: 11.03.2011
Сообщений: 49
29.07.2013, 14:38  [ТС]     Доступ к памяти по адресу #23
current указатель, да
поле address имеет тип unsigned long long int
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
29.07.2013, 14:38     Доступ к памяти по адресу #24
Цитата Сообщение от zybrzybr Посмотреть сообщение
current->_address++;
это адрес +1 но не свиг указателя на sizeof(..)
Именно что сдвиг на сайзоф, а не просто плюс один!
в этом и ошибка!
xanderfomin
40 / 37 / 8
Регистрация: 25.10.2012
Сообщений: 112
29.07.2013, 14:38     Доступ к памяти по адресу #25
Kuzia domovenok, что тебе не нравится? Я так понимаю, у sly4ainaya LLP64, т.е. указатель является 64-битным адресом.
sly4ainaya
2 / 2 / 0
Регистрация: 11.03.2011
Сообщений: 49
29.07.2013, 14:42  [ТС]     Доступ к памяти по адресу #26
да, у меня там так и сделано, просто сюда это решила не писать.. тогда наверное, нужно к адресу не 1, а 8 прибавлять

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

Добавлено через 33 секунды
на +8 ругается компилятор
xanderfomin
40 / 37 / 8
Регистрация: 25.10.2012
Сообщений: 112
29.07.2013, 14:42     Доступ к памяти по адресу #27
sly4ainaya, либо можешь считать свой адрес указателем на char и прибавлять единицу.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
29.07.2013, 14:42     Доступ к памяти по адресу #28
Цитата Сообщение от sly4ainaya Посмотреть сообщение
да, у меня там так и сделано, просто сюда это решила не писать.. тогда наверное, нужно к адресу не 1, а 8 прибавлять
1) адрес должен иметь тип int* тогда к нему надо прибавлять один.
2) если он имеет тип unsigned long long int то это странно, но можно наверное по 4 прибавлять, но лучше не надо.
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.07.2013, 14:44     Доступ к памяти по адресу #29
если Вы пишете к адресу ++, то у тебяВас адрес увеличивается на sizeof(тип указателя), Вам собственно и надо выводить так в цикле, делая ++ на каждой итерации, не забывая разименовывать его, не удивлюсь если в выводе будет полный бред
sly4ainaya
2 / 2 / 0
Регистрация: 11.03.2011
Сообщений: 49
29.07.2013, 14:45  [ТС]     Доступ к памяти по адресу #30
в выводе как раз полный бред, да
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.07.2013, 14:46     Доступ к памяти по адресу #31
Может необходимо сначала заполнить это пространство памяти полезной инфой ?) или Вы, забыли разименовать и выводятся адреса
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) Ничего странного здесь нет, как я уже говорил.
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 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).
бред. Сам проверишь или как?
aLarman
29.07.2013, 14:52
  #34

Не по теме:

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

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

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

Добавлено через 34 секунды
Цитата Сообщение от sly4ainaya Посмотреть сообщение
а sizeof ( double) не прибавляется
никаких sizeof прибавлять не нужно это бред
aLarman
641 / 562 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
29.07.2013, 14:56     Доступ к памяти по адресу #37
sly4ainaya, у Вас, в памяти хранится long long, сделав к указателю +1, вы сместитесь к следущему элементу, т.е на 8байт по памяти зачем пытаться прибавить sizeof(double)
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 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;
aLarman
641 / 562 / 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).
помоему вам необходим раздел "Арифметика указателей"

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2013, 15:04     Доступ к памяти по адресу
Еще ссылки по теме:
C++ Как сделать массив в памяти по фиксированному адресу?
C++ Вызов функции-члена класса по адресу в памяти
C++ Вызвано исключение по адресу 0x0FD466CB (ucrtbased.dll). Динамическое выделение памяти
Разработать программу позволяющую получить дамп памяти по адресу содержащему вводимые числа C++
Необработанное исключение по адресу, нарушение прав доступа при записи по адресу C++

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

Или воспользуйтесь поиском по форуму:
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, да нет, с адресной арифметикой всё в порядке, спасибо.
Тут уже просто пошла путаница между адресами и указателями.
Yandex
Объявления
29.07.2013, 15:04     Доступ к памяти по адресу
Ответ Создать тему
Опции темы

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