2009-06-03 33 views
5

Tôi cần trình bày con trỏ dưới dạng chuỗi cho người dùng. Đôi khi các giá trị có thể được lưu vào một tệp và chuyển sang máy tính có kiến ​​trúc khác nhau (32 so với 64 bit là vấn đề chính hiện tại) và được tải từ tệp văn bản để so sánh - Tôi chỉ so sánh giá trị được tải với nhau, nhưng tôi vẫn muốn so sánh các số hơn chuỗi.Cách di động tốt nhất để biểu diễn con trỏ dưới dạng chuỗi trong C++ là gì?

Tôi hiện đang sử dụng:

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

nhưng tôi tự hỏi nếu điều này là xách tay (Windows và Linux chỉ quan trọng ở giai đoạn này mặc dù), và liệu điều này sẽ phá vỡ một lần hệ thống 128-bit hiển thị?

Chỉnh sửa: trừ khi tôi quyết định sử dụng uint64_t và quyết định 64bit là tầng trên, điều này không thể thực hiện được vì một số con trỏ 64 bit có thể nằm ngoài phạm vi số nguyên 32 bit. Vì vậy, tôi quyết định rằng nó sẽ an toàn hơn để so sánh các chuỗi ngay cả khi nó chậm hơn.

Trả lời

20

Đối với con trỏ, luôn sử dụng %p --- đó là trình định dạng định dạng được thiết kế đặc biệt để in con trỏ ở định dạng phù hợp. :-)

+1

Nhưng không phải di động. Ít nhất, nó không cho đầu ra phù hợp giữa các nền tảng. Trong studio trực quan, giá trị hex xuất hiện theo mũ.Trong gcc, chữ thường. – user48956

+2

* lắc đầu * Đó có phải là sự khác biệt đáng lo ngại không? Bạn có thể _never_ có địa chỉ xuất hiện theo cùng một cách trên tất cả các nền tảng --- ví dụ: trong chương trình DOS chế độ thực 16 bit, địa chỉ thường được in ở định dạng xxxy: yyyy. (Bạn không thể loại bỏ dấu hai chấm "chỉ để nhất quán giữa các nền tảng" --- điều đó sẽ rất gây hiểu nhầm, bởi vì không gian địa chỉ trong các chương trình DOS thực sự không phẳng.) –

+0

ví dụ: 0x11110000 và 0x11120000, trong mô hình địa chỉ bằng phẳng , cách nhau 0x10000 byte. Tuy nhiên, trong các chương trình DOS chế độ thực 16 bit, 1111: 0000 và 1112: 0000 cách nhau 16 byte. –

7

printf có p formatter% mà tôi tin là chuẩn:

printf("%p", p); 

nhưng khi bạn đang sử dụng C++, ostreams đã quá tải đầu ra con trỏ:

#include <iostream> 
using namespace std;; 

class A {}; 

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

sản xuất:

0x22ff6f 
+0

Rất, rất chuẩn. :-P –

+1

Hãy cẩn thận mặc dù. Vì chúng cũng chuyên về toán tử đầu ra cho char * và in một C-String. –

9

Tôi muốn làm điều này:

std::cout << p; 

Nếu bạn đã trái tim của bạn đặt trên cstdio:

printf("%p", p); 
+1

Cảm ơn Fred. Trên thực tế, tôi đang sử dụng wxWidgets trong đó có wxString :: Định dạng chức năng sử dụng snprintf nội bộ vì vậy đó là lý do tại sao tôi cần printf ví dụ. –

3

Bạn đang tìm kiếm chuỗi %p định dạng?

printf("%p", p); 

Điều này sẽ cung cấp địa chỉ mã hóa hex con trỏ trỏ tới (và, tôi nghĩ, định dạng NULL s cho bạn).

0

tôi đã làm:

cout << p << endl; 

Strings (của mã hóa giống nhau) là cầm tay. Nếu bạn muốn so sánh chúng dưới dạng con trỏ, trước tiên bạn phải phân tích cú pháp chuỗi thành một unsigned long.

Đối với hệ thống 128 bit, chúng là cách tắt. Với 64 bit, bạn có thể trực tiếp giải quyết 16,8 triệu terabyte RAM.

0

Nó cũng có thể được thực hiện dưới dạng

printf ("% # x", p);

Điều này sẽ đảm bảo định dạng tương tự (0x ...) trên các nền tảng.

Các vấn đề liên quan