C ++ как получить адрес, сохраненный в указателе void?
Вопрос
как я могу получить адрес памяти значения, на которое указывает указатель?в моем случае это указатель void.простое присвоение его uint выдает мне эту ошибку:
Error 1 error C2440: 'return' : cannot convert from 'void *' to 'UInt32'
Спасибо!
Решение
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.
@Пол Се
Я думаю, этого достаточно, чтобы преобразовать void*
Для size_t
в этом конкретном вопросе по трем причинам:
Вопрошающий не уточнил, если он хочет портативное решение или нет.Он сказал, что у него это сработало.Я не знаю точно, что это значит, но мне ясно, что он работает над IA-32 в Windows или другой системе в защищенном режиме.Это означает, что преобразование указателя в целое число является определенной операцией в этой системе, даже если это не определено стандартным C ++.
Во-вторых, я предложил сначала преобразовать указатель в
int
что явно бессмысленно, поскольку литб и джалф показал мне.Я исправил допущенную ошибку и заменилint
сsize_t
.Наконец, я изо всех сил старался найти что-то соответствующее тому, что вы предложили в качестве решения в стандартах.К сожалению, я не смог найти ничего подходящего.У меня есть эта ссылка: ANSI ISO IEC 14882 2003.Я думаю, селлибитце указал , что это будет будьте частью грядущих стандартов.Я действительно не разбираюсь в C, и, очевидно, C99 представил это идеальное решение.Я бы хотел, чтобы кто-нибудь показал мне переносимое решение на C ++.
Пожалуйста, не стесняйтесь исправлять мои ошибки, я все еще студентка универа :)
Спасибо,
Другие советы
Указатель в C и C++ является воплощение адреса памяти в некоторой абстрактной форме.Вы можете получить специфичную для реализации строковую интерпретацию указателя следующим образом:
printf ("%p", voidPointer);
Другой способ — привести его к intptr_t:
(intptr_t) voidPointer;
Указатель NULL в C++ определяется как равный «0», поэтому предположительно в приведенной выше операции вы получите эквивалент (intptr_t) 0.Однако это все еще зависит от вас и от того, какими конкретными знаниями о реализации вы должны интерпретировать это как адрес памяти.
Дело в том, что на платформах, которые используют причудливые модели памяти, такие как 16-битные компиляторы DOS x86, в которых в качестве модели памяти используются сегменты со смещениями, указатели можно интерпретировать разными способами.В представлении необработанного адреса NULL может быть DS:0 или SS:0, а не просто 0.
Вам нужен актерский состав - либо reinterpret_cast
(предпочтительно):
UInt32 address = reinterpret_cast<UInt32>( voidPointer );
или приведение в стиле C (действительно не рекомендуется):
UInt32 address = (UInt32)voidPointer;
Вы можете получить строковое представление адреса с помощью sprintf() или отобразить его с помощью printf(), используя спецификатор формата %p, например:
printf( "%p", voidptr ) ;
Если вы просто хотите, чтобы адрес выполнял арифметические операции с указателем, приведите его к соответствующему указателю конкретного типа данных, в противном случае приведите его к целому числу, как уже предлагалось.
В C++ мне удалось напечатать указанный адрес с помощью:
cout << "Address: " << ((unsigned)my_ptr);