Есть ли способ преобразовать адрес в памяти, представленный void* (например 0xbff2c680), в целое число?
Не в этом смысле:
void f(void* p)
{
int x = *((int*)p);
}
а именно получить в переменной x значение адреса памяти, хранящегося в переменной p — то есть 0xbff2c680. То есть после выполнения этой операции в x было бы значение 0xbff2c680.
Если такой способ существует, то как осуществить обратную операцию — целочисленное значение преобразовать в адресс памяти, который можно разыменовывать и т.д.?
Здравствуйте, SergeyLa, Вы писали:
SL>Есть ли способ преобразовать адрес в памяти, представленный void* (например 0xbff2c680), в целое число?
SL>Не в этом смысле:
SL>SL>void f(void* p)
SL>{
SL> int x = *((int*)p);
SL>}
SL>
SL>а именно получить в переменной x значение адреса памяти, хранящегося в переменной p — то есть 0xbff2c680. То есть после выполнения этой операции в x было бы значение 0xbff2c680.
long i = reinterpret_cast<long>( p );
SL>Если такой способ существует, то как осуществить обратную операцию — целочисленное значение преобразовать в адресс памяти, который можно разыменовывать и т.д.?
Аналогично
Строго говоря, это преобразование implementation defined, но "is intended to be unsurprising to those who know the addressing structure of the underlying machine.". Главное, чтобы размер целочисленного типа был не меньше указателя.
Здравствуйте, SergeyLa, Вы писали:
SL>SL> size_t x = (size_t)p;
SL>
указатель не на всех платформа в инт поместится, лучше юзай size_t.
Здравствуйте, Nik_1, Вы писали:
N_>Здравствуйте, SergeyLa, Вы писали:
SL>>SL>> size_t x = (size_t)p;
SL>>
N_>указатель не на всех платформа в инт поместится, лучше юзай size_t.
В size_t, увы, тоже не всегда может поместиться. Подробнее
здесьАвтор:
Дата: 05.05.08
Здравствуйте, SergeyLa, Вы писали:
SL>Есть ли способ преобразовать адрес в памяти, представленный void* (например 0xbff2c680), в целое число?
SL>Не в этом смысле:
SL>SL>void f(void* p)
SL>{
SL> int x = *((int*)p);
SL>}
SL>
SL>а именно получить в переменной x значение адреса памяти, хранящегося в переменной p — то есть 0xbff2c680. То есть после выполнения этой операции в x было бы значение 0xbff2c680.
SL>Если такой способ существует, то как осуществить обратную операцию — целочисленное значение преобразовать в адресс памяти, который можно разыменовывать и т.д.?
void* p = 0;
uintptr_t n = reinterpret_cast<uintptr_t>( p );
void p2 = reinterpret_cast<void*>( n )
и понадобится заинклудить хидер где он определен для gcc.
Здравствуйте, Nik_1, Вы писали:
N_>указатель не на всех платформа в инт поместится, лучше юзай size_t,
which is the unsigned integer type of the result of the sizeof operator
Так что лучше бы
7.18.1.4 Integer types capable of holding object pointers
1 The following type designates a signed integer type with the property that any valid
pointer to void can be converted to this type, then converted back to pointer to void,
and the result will compare equal to the original pointer:
intptr_t
The following type designates an unsigned integer type with the property that any valid
pointer to void can be converted to this type, then converted back to pointer to void,
and the result will compare equal to the original pointer:
uintptr_t
These types are optional
но из действующих стандартов это есть только в C, не C++.
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth