С++ как получить адрес, сохраненный в указателе 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);