Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> VirtualAlloc 
:(
    Опции темы
lavan
Дата 24.9.2011, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 21.4.2011

Репутация: нет
Всего: нет



Народ,подскажите кто знает.Разбираюсь с фун VirtualAlloc();Работа с участком памяти
расспределенным этой функцией в принципе похожа на работу с участком памяти полученным
фун new?Т.е распределил память под int поместить могу туда только значения int?
И еще,распределяю память под массив строк
Код

char **ptr_toscope=NULL;
char **ptr_toarray=NULL;
char *mas[2]={"kola","gfdd"};
char *mas2[2]={"abc","rty"};
ptr_toscope=(char**)VirtualAlloc(NULL,1024,MEM_RESERVE,PAGE_READWRITE);//зарезервировали память
    ptr_toarray=(char**)VirtualAlloc(ptr_toscope,500,MEM_COMMIT,PAGE_READWRITE);//распределили память
//перед выполнением этого действия &ptr_toscope==&ptr_toarray
ptr_toarray=mas;//
//теперь адресс ptr_toarray уменьшился т.е был 230000 стал 12ff3c не понемаю почему????????
cout<<endl<<*(ptr_toarray+1);//вывел второе слово
//ptr_toarray+=0x8;//адрес увеличился на 20 хотя прибавляю 8 ПОЧЕМУ?????????????
ptr_toarray=mas2;//после выполнения этого действия адрес стал меньше чем 12ff3c это не смотря на предыдущее увеличение адреса
//КАК я это пнял:После распределения куска зарезерв памяти я могу работать с ним только как со стеком?
//изначально я получаю самый старший адрес,а когда заношу значения то каждое новое значение получает 
//меньший адрес и так до самого нижнего адреса????

PM MAIL   Вверх
Estranged
Дата 24.9.2011, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: нет
Всего: 3



Вы же не пишете в память, куда указывает ptr_toarray, а присваиваете в ptr_toarray новый адрес - адрес mas:
Код

ptr_toarray=mas;


Если непонятно: Вы не записали по адресу ptr_toarray содержимое, просто изменили сам указатель  ptr_toarray.
Цитата(lavan @  24.9.2011,  16:45 Найти цитируемый пост)
//после выполнения этого действия адрес стал меньше чем 12ff3c

Это зависит от того, как компилятор разместит в стеке mas и mas2.

Цитата(lavan @  24.9.2011,  16:45 Найти цитируемый пост)
//ptr_toarray+=0x8;//адрес увеличился на 20 хотя прибавляю 8 ПОЧЕМУ?????????????

Он стал 0x20 (32 в десятичной), потому что это арифметика указателей такая. ptr_toarray - указатель на указатель. Он может адресовать только указатели, которые в данном случае занимают 4 байта. А прибавить 8 раз по 4 байта как раз и выходит 32 байта - вы задаете смещение НЕ в байтах, а в количествах элементов того типа, на который заведен указатель - указатель на указатель. Т.е. это ptr_toarray [8] - обращение к 8-му указателю.

Добавлено через 14 минут и 3 секунды
upd.
Цитата(lavan @  24.9.2011,  16:45 Найти цитируемый пост)
Работа с участком памяти
расспределенным этой функцией в принципе похожа на работу с участком памяти полученным
фун new?

да

Цитата(lavan @  24.9.2011,  16:45 Найти цитируемый пост)
Т.е распределил память под int поместить могу туда только значения int?

Нет, туда можно писать что угодно. Только к нужному типу надо приводить адрес, возвращаемый VirtualAlloc:
Код

    void *void_ptr = NULL;

    void_ptr = VirtualAlloc (NULL, 1024, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    int *int_ptr = NULL;
    float *float_ptr = NULL;
    int_ptr = (int *) void_ptr;
    *int_ptr = 123;// запишем целое число
    float_ptr = (float *)((LPBYTE)void_ptr + sizeof (int));// пропускаем наш int
    *float_ptr = 123.f; // запишем дробное число позади нашего int.
    float res = *int_ptr * *float_ptr;// считаем числа
    VirtualFree (void_ptr, 0, MEM_RELEASE);


Это сообщение отредактировал(а) Estranged - 24.9.2011, 23:51
PM MAIL   Вверх
lavan
Дата 25.9.2011, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 21.4.2011

Репутация: нет
Всего: нет



секунду,знак = копирует данные находящиеся по адресу правого опперанда в 
ячейку памяти левого опереанда т.е
Код

ptr_toarray=mas;

копирую значение находящееся по адресу mas в ячейку по адресу ptr_toarray
в моем случае mas-это указатель на указатель значит я копирую в ячейку с
адресом ptr_toarray значение находящееся по адресу mas которое является 
указателем на массив указателей.а никак не меняю адрес ptr_toarray.Разве нет!? 
кроме того смотрю адресс mas 004070В6 а после
Код
 
ptr_toarray=mas;

адрес ptr_toarray 12ff3c 
PM MAIL   Вверх
Estranged
Дата 25.9.2011, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 158
Регистрация: 30.8.2010

Репутация: нет
Всего: 3



Цитата(lavan @  25.9.2011,  13:08 Найти цитируемый пост)
секунду,знак = копирует данные находящиеся по адресу правого опперанда в 
ячейку памяти левого опереанда


Почти верно в данном случае. Здесь Вы копируете не содержимое по адресу mas, а адрес самого mas.
Чтобы это понять, надо взглянуть на дизассемблерный код:
Код

   648:     ptr_toarray=mas;//
000000013FDF14DB  lea         rax,[mas]  
000000013FDF14E0  mov         qword ptr [ptr_toarray],rax 

Смотрите, инструкция lea ("load effective address") - это инструкция загрузки адреса - загрузить адрес mas в регистр rax. mov делает запись в адрес, где размещен ptr_toarray. Квадратные скобки - писать в адрес ptr_toarray. Повторяю, не по адресу, который содержит ptr_toarray, а в по адресу самой переменной ptr_toarray. Вы переустанавливаете указатель ptr_toarray на новый адрес.

Знаете ли Вы оператор разыменования указателя?

А теперь сравните, что делает оператор разыменования в С - звездочка (*):
Код

   648:     *ptr_toarray=*mas;//
000000013FBF14DB  mov         rax,qword ptr [ptr_toarray]  ; поместить в rax содержимое по адресу ptr_toarray, 
;квадратные скобки - читать из адреса ptr_toarray
000000013FBF14E0  mov         rcx,qword ptr [mas]  ; поместить в rcx содержимое по адресу mas, это то 
;же самое, что взять запись из mas[0], оно же адрес строки "kola"
000000013FBF14E5  mov         qword ptr [rax],rcx ; а вот запись адреса строки "kola" по адресу, 
;который хранится в указателе ptr_toarray, как Вы видите, в первой инструкции мы взяли адрес, 
;хранящийся в ptr_toarray, а теперь пишем по этому адресу. Квадратные скобки - это признак, 
;что надо писать в адрес, который задает регистр rax


Вы путаете адрес самого указателя с адресом, который этот же указатель хранит. Т.е. не знаете, как работать с указателями.

Даже тему переместили.

Это сообщение отредактировал(а) Estranged - 25.9.2011, 20:30
PM MAIL   Вверх
xvr
Дата 25.9.2011, 20:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Наличие слова VirtutalAlloc еще не является признаком 'Системного программирования'. А уж удивление ТС по поводу того, что оператор присваивания действительно таки присваивает, явно указывает нато, что автор ошибся с разделом.

Модератор:  Тему перенес

PM MAIL   Вверх
bsa
Дата 25.9.2011, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



lavan, бегом читать прикрепленную тему "ответы на часто задаваемые вопросы", в частности "указатели и ссылки". СРОЧНО!
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.