Что такое правильный бросок от void * к long? - PullRequest
2 голосов
/ 16 октября 2019

Я использую posix_memalign (были проблемы с align_alloc), чтобы распределить (внутри моего new), поэтому у меня есть void*. Мне нужно это как int, например, для вычисления выравнивания:

#include <iostream>
using std::cout;
using std::cin;
using std::endl;

int main() {

  void *ptr;
  auto align{4096}, size{10000};
  posix_memalign( &ptr,align,size );
  cout << ptr << endl; // works
  cout << ptr % align << endl; // not

  return 0;
}

Я думал, что в современном C ++ static_cast<long> это правильный путь, но это дает ошибку, которая не допускается на void*. Так каков правильный путь? Конечно, я могу использовать броски в старом стиле С, но я стараюсь их избегать.

Ответы [ 2 ]

9 голосов
/ 16 октября 2019

Вы не можете static_cast указатель на тип без указателя. Возможно, вам придется использовать reinterpret_cast:

reinterpret_cast<long>(ptr);

Кроме того, поскольку вы хотите получить адрес указателя в виде целого числа, лучше использовать intptr_t, присутствующий в stdint.h (что сделано для этой цели):

reinterpret_cast<intptr_t>(ptr);
0 голосов
/ 16 октября 2019

, чтобы просто напечатать адрес

std :: cout << "Адрес указателя = 0x" << void_pointer_var << std :: endl; </p>

при условии, что void_pointer_var имеет тип void *,это напечатает его значение в шестнадцатеричном формате.

, если его значение для него должно быть в десятичном, то используйте переинтерпретацию приведения

...