С++ как получить адрес, сохраненный в указателе void?
как я могу получить адрес памяти значения, на которое указывает указатель? в моем случае это указатель на пустоту.
просто присваивая его uint, я получаю эту ошибку:
Error 1 error C2440: 'return' : cannot convert from 'void *' to 'UInt32'
спасибо!
Ответы
Ответ 1
std::size_t address = reinterpret_cast<std::size_t>(voidptr);
// sizeof(size_t) must be greater or equal to sizeof(void*)
// for the above line to work correctly.
@Paul Ssieh
Я думаю, что в этом конкретном вопросе достаточно преобразовать void*
в size_t
по трем причинам:
-
Опросщик не уточнил,
хочет портативное решение или нет. Он
сказал, что он с ним работал. Я точно не знаю, что
это означает, что
мне ясно, что он
работая на IA-32 на Windows или другой
системы в защищенном режиме. Что
означает преобразование указателя в
integer - определенная операция на
эта система, даже если она не определена стандартным С++.
-
Во-вторых, я предложил сначала преобразовать указатель в int
, который явно бессмыслен, поскольку litb и jalf показал мне. Я исправил ошибку, которую я сделал, и заменил int
на size_t
.
-
Наконец, я попытался изо всех сил найти что-то, что было предложено в качестве решения в стандартах. К сожалению, я не нашел ничего подходящего. У меня есть эта ссылка: ANSI ISO IEC 14882 2003. Я думаю, что sellibitze отметил, что он будет частью предстоящих стандартов. Я действительно не знаю о C, и, очевидно, C99 представила это идеальное решение. Я бы хотел, чтобы кто-то показал мне портативное решение на С++.
Пожалуйста, не стесняйтесь исправлять свои ошибки, я все еще студент в uni:)
Спасибо,
Ответ 2
Указатель в C и С++ является вариантом адреса памяти в некоторой абстрактной форме. Вы можете получить строковую интерпретацию указателя строки, как:
printf ("%p", voidPointer);
Другой способ - передать его intptr_t:
(intptr_t) voidPointer;
Указатель NULL в С++ определяется как равный "0", поэтому предположительно вы получите эквиважность (intptr_t) 0 в приведенной выше операции. Тем не менее, все еще зависит от вас и любых конкретных конкретных знаний, которые вы должны понимать в качестве адреса памяти.
Дело в том, что на платформах, использующих причудливые модели памяти, такие как 16-битные x86 DOS-компиляторы, имеющие сегменты с смещениями в качестве модели памяти, указатели можно интерпретировать по-разному. В представлении необработанного адреса NULL может быть DS: 0 или SS: 0, а не просто равным 0.
Ответ 3
Вам нужен листинг - либо reinterpret_cast
(желательно):
UInt32 address = reinterpret_cast<UInt32>( voidPointer );
или приведение в стиле C (действительно не рекомендуется):
UInt32 address = (UInt32)voidPointer;
Ответ 4
Вы можете получить строковое представление адреса с помощью sprintf() или отобразить его с помощью printf() с помощью спецификатора формата% p, например:
printf( "%p", voidptr ) ;
Если вы просто хотите, чтобы адрес выполнял арифметику указателя, примените его к соответствующему конкретному указателю типа данных, в противном случае добавьте его к целому числу, как уже было предложено.
Ответ 5
В С++ я смог напечатать указанный адрес с помощью:
cout << "Address: " << ((unsigned)my_ptr);