2011-06-22 38 views
9

Khi tôi biên dịch và chạy mã C++ này, tôi không nhận được kết quả mong đợi.C++ Giá trị in của con trỏ cho kết quả lạ

#include <iostream> 
using namespace std; 

int main() 
{ 
    int * i = new int; 
    long * l = new long; 
    char * c = new char[100]; 
    float * f = new float[100]; 

    cout << "i " << i << endl; 
    cout << "l " << l << endl; 
    cout << "c " << c << endl; 
    cout << "f " << f << endl; 


    delete i; 
    delete l; 
    delete []c; 
    delete []f; 

    cin.get(); 
    return 0; 
} 

Trên một máy unix tôi nhận được

i 0x967f008 
l 0x967f018 
c 
f 0x967f090 

Trên một máy cửa sổ giá trị cho các bản in c như trên một dòng ký tự ngẫu nhiên.

Xin vui lòng ai đó có thể giải thích lý do tại sao nó không in con trỏ cho mảng char một cách chính xác.

Cảm ơn

Trả lời

19

operator << cho std::ostreamstd::wostream được định nghĩa theo cách đặc biệt cho con trỏ char (char*, const char*, wchar_t*const wchar_t* để in ra một chuỗi null-chấm dứt. Điều này cho phép bạn viết

const char* str = "Hello, World"; 
std::cout << str; 

và xem một đẹp trên hình minh họa của bạn

Để nhận giá trị con trỏ, hãy truyền tới void *

std::cout << static_cast<void*>(c) 
4

Các operator<< bị quá tải cho char*. Nó sẽ xem xét rằng bạn đang cố gắng in một chuỗi C-style, và in tất cả các ký tự cho đến khi nó tìm thấy một 0x00. Vì bạn không khởi tạo bộ nhớ được cấp phát, nó sẽ in ra rác ngẫu nhiên.

+0

C++ cách để thực hiện là gì? –

+1

sẽ là 'reinterpret_cast (c)'. – Mat

+2

@hexa: Mặc dù @Mat là đúng trong đó '(void *) c' tương đương với' reinterpret_cast (c) ', cách * C++ * của việc đó là' static_cast (c) '; –

0

Vì không có khởi tạo trong char chỉ bởi c, bạn đổ một số giá trị bộ nhớ ngẫu nhiên cho đến khi nó tìm thấy một giá trị có giá trị 0. Nó đôi khi sẽ sụp đổ, khi không tìm thấy cho đến khi kết thúc bộ nhớ có thể đọc của bạn. Viết mã như thế này bị cấm và sai trong Unix cũng vậy và trong bất kỳ hệ điều hành nào khác.

0

Ký tự char * thực sự là chuỗi C. Vì vậy, tôi đoán nó đang cố gắng in nó như một chuỗi.

Một cách để buộc các địa chỉ con trỏ được in là sử dụng printf: `(void *) c`:

printf("%p\n", c); 
Các vấn đề liên quan