Какой лучший способ представления указателя в виде строки в C ++? - PullRequest
5 голосов
/ 04 июня 2009

Мне нужно представлять указатели в виде строк для пользователя. Иногда значения могут быть сохранены в файл и перенесены на компьютер с другой архитектурой (в настоящее время основной проблемой является 32-битная или 64-битная) и загружены из сравниваемого текстового файла - я собираюсь сравнить только загруженные значения с друг друга , но я бы все же предпочел сравнивать числа, чем строки.

Я сейчас использую:

SomeClass* p;
...
printf("%ld", (uintptr_t)p);

но мне интересно, переносимо ли это (хотя на данном этапе важны только Windows и Linux) и не сломается ли это, когда появятся 128-битные системы?

Редактировать : если я не решу использовать uint64_t и не решу, что 64-битная версия - это крыша, это невозможно сделать, потому что какой-то 64-битный указатель может быть вне 32-битного целочисленного диапазона. Поэтому я решил, что сравнивать строки будет безопаснее, даже если он медленнее.

Ответы [ 6 ]

20 голосов
/ 04 июня 2009

Для указателей всегда используйте %p --- это спецификатор формата, специально разработанный для печати указателей в правильном формате. : -)

9 голосов
/ 04 июня 2009

Я бы сделал это:

std::cout << p;

Если ваше сердце настроено на cstdio:

printf("%p", p);
7 голосов
/ 04 июня 2009

printf имеет форматер% p, который я считаю стандартизированным:

printf( "%p", p );

но поскольку вы используете C ++, ostreams уже перегружают вывод указателя:

#include <iostream>
using namespace std;;

class A {};

int main() {
    A a;
    cout << &a << endl;
}

производит:

0x22ff6f
3 голосов
/ 04 июня 2009

Вы ищете строку форматирования %p?

printf("%p", p);

Это даст шестнадцатеричный адрес, на который указывает указатель (и, я думаю, также форматирует NULL s для вас).

0 голосов
/ 01 сентября 2009

Это также можно сделать как

printf ("% # x", p);

Это обеспечит одинаковый формат (0x ...) для разных платформ.

0 голосов
/ 04 июня 2009

Я бы сделал:

cout << p << endl;

Строки (с одинаковой кодировкой) являются переносимыми. Если вы хотите сравнить их как указатели, вы должны сначала разобрать строку в unsigned long.

Что касается 128-битных систем, то они далеко. С 64 битами вы можете напрямую обращаться к 16,8 миллионам терабайт оперативной памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...