Получить значение адреса в целую переменную и наоборот
От: SergeyLa  
Дата: 01.11.09 14:20
Оценка:
Есть ли способ преобразовать адрес в памяти, представленный void* (например 0xbff2c680), в целое число?

Не в этом смысле:
void f(void* p)
{
  int x = *((int*)p);
}


а именно получить в переменной x значение адреса памяти, хранящегося в переменной p — то есть 0xbff2c680. То есть после выполнения этой операции в x было бы значение 0xbff2c680.

Если такой способ существует, то как осуществить обратную операцию — целочисленное значение преобразовать в адресс памяти, который можно разыменовывать и т.д.?
Re: Получить значение адреса в целую переменную и наоборот
От: Fwiffo Россия  
Дата: 01.11.09 14:33
Оценка: 3 (1)
Здравствуйте, 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.". Главное, чтобы размер целочисленного типа был не меньше указателя.
Re: Получить значение адреса в целую переменную и наоборот
От: Nik_1 Россия  
Дата: 01.11.09 14:45
Оценка: 3 (1)
Здравствуйте, SergeyLa, Вы писали:
SL>
SL>  size_t x = (size_t)p;
SL>


указатель не на всех платформа в инт поместится, лучше юзай size_t.
Re[2]: Получить значение адреса в целую переменную и наоборо
От: Bell Россия  
Дата: 02.11.09 03:06
Оценка:
Здравствуйте, Nik_1, Вы писали:

N_>Здравствуйте, SergeyLa, Вы писали:

SL>>
SL>>  size_t x = (size_t)p;
SL>>


N_>указатель не на всех платформа в инт поместится, лучше юзай size_t.


В size_t, увы, тоже не всегда может поместиться. Подробнее здесь
Автор:
Дата: 05.05.08
Любите книгу — источник знаний (с) М.Горький
Re: Получить значение адреса в целую переменную и наоборот
От: SleepyDrago Украина  
Дата: 02.11.09 09:07
Оценка: +2
Здравствуйте, 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.
Re[2]: Получить значение адреса в целую переменную и наоборо
От: gear nuke  
Дата: 02.11.09 11:16
Оценка:
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.