C ++ как получить адрес, сохраненный в указателе void?

StackOverflow https://stackoverflow.com/questions/1593580

  •  22-09-2019
  •  | 
  •  

Вопрос

как я могу получить адрес памяти значения, на которое указывает указатель?в моем случае это указатель 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top