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

Что это значит: *(void**)ReturnValue) = hHeap; ? - C++

Восстановить пароль Регистрация
 
IvanPryamoy_2
0 / 0 / 0
Регистрация: 21.01.2013
Сообщений: 23
21.01.2013, 17:00     Что это значит: *(void**)ReturnValue) = hHeap; ? #1
Вот честно, не могу понять что значит вторая строчка кода:

C++
1
2
void* ReturnValue = (void*) HeapAlloc((HANDLE) hHeap, HEAP_GENERATE_EXCEPTIONS | HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, count + sizeof(void*) );
*((void**)ReturnValue) = hHeap;
Если написать:
C++
1
*ReturnValue = hHeap;
, то появляется ошибка: "error C2100: недопустимое косвенное обращение". Так чем вышепревиденное извращение с преобразованием к двойному указателю, а потом обращение по нему лучше?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2013, 17:00     Что это значит: *(void**)ReturnValue) = hHeap; ?
Посмотрите здесь:

C++ что это значит?
C++ Что значит void(*f)()=(void(*)()func?
a=*b Что это значит? C++
Что это значит? C++
C++ что это значит?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pure
 Аватар для Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
21.01.2013, 17:09     Что это значит: *(void**)ReturnValue) = hHeap; ? #2
Изначально ReturnValue - просто указатель

*((void**)ReturnValue) = hHeap; - здесь он преобразован к указателю на указатель, далее разыменован и представляет из себя указатель.
То бишь ReturnValue.

Если обратится как ты пишешь *ReturnValue = hHeap, то будет ошибка доступа - ты разыменовываешь указатель на void и пытаешься "этому нечто" что то присвоить.


*((void**)ReturnValue) = hHeap; - эта запись и правда лишена смысла. она равна следующей

ReturnValue = hHeap;
IvanPryamoy_2
0 / 0 / 0
Регистрация: 21.01.2013
Сообщений: 23
21.01.2013, 17:36  [ТС]     Что это значит: *(void**)ReturnValue) = hHeap; ? #3
Цитата Сообщение от Pure Посмотреть сообщение
*((void**)ReturnValue) = hHeap; - эта запись и правда лишена смысла. она равна следующей

ReturnValue = hHeap;
Нет, эти записи не равнозначны. В первом случае значение ReturnValue (адрес) не меняется, а во втором становится равным hHeap (проверено отладчиком). Другими словами в первом случае происходит присвоение значения по адресу ReturnValue, а во втором- присвоение указателя (теперь два указателя ссылаются на одно место в памяти).

Мне как раз и надо по адресу ReturnValue положить значение hHeap (чтобы в операторе delete его извлечь).
Pure
 Аватар для Pure
228 / 49 / 2
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
21.01.2013, 17:41     Что это значит: *(void**)ReturnValue) = hHeap; ? #4
IvanPryamoy_2, ReturnValue это указатель на void, то бишь void*. Типа void как такового не быть.
Незя его разыменовать. Далее hHeap это скорее всего тип HANDLE. котрый в итоге является тем же void*

http://vsokovikov.narod.ru/New_MSDN_...te_windows.htm

поэтому

ReturnValue = hHeap;

это гуд

Если надо положить по указателю какое то значение то приведи его к DWORD хотя бы.
IvanPryamoy_2
0 / 0 / 0
Регистрация: 21.01.2013
Сообщений: 23
21.01.2013, 18:02  [ТС]     Что это значит: *(void**)ReturnValue) = hHeap; ? #5
Цитата Сообщение от Pure Посмотреть сообщение
IvanPryamoy_2, ReturnValue это указатель на void, то бишь void*. Типа void как такового не быть.
Незя его разыменовать. Далее hHeap это скорее всего тип HANDLE. котрый в итоге является тем же void*

http://vsokovikov.narod.ru/New_MSDN_...te_windows.htm

поэтому

ReturnValue = hHeap;

это гуд

Если надо положить по указателю какое то значение то приведи его к DWORD хотя бы.
Так в моем примере как раз кладется значение по указателю (значением является тоже указатель). Но что эта фраза значит мне непонятно.
Yandex
Объявления
21.01.2013, 18:02     Что это значит: *(void**)ReturnValue) = hHeap; ?
Ответ Создать тему
Опции темы

Текущее время: 15:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru