2011-06-22 48 views
9

當我編譯並運行這個C++代碼時,我沒有得到我期望的輸出。C++打印指針值給出奇怪的結果

#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; 
} 

在UNIX機器上,我得到

i 0x967f008 
l 0x967f018 
c 
f 0x967f090 

在Windows機器上對C打印值作爲經過一條線路的隨機字符。

請有人可以解釋爲什麼它不正確地打印字符數組的指針。

感謝

回答

19

operator <<std::ostreamstd::wostream是在字符指針(char*const char*wchar_t*const wchar_t*打印出一個空值終止字符串特殊的方式來定義。這使您可以編寫

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

,看到一個漂亮的串在你的標準輸出。

得到的指針值,轉換爲void *

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

operator<<超載爲char*。它會認爲您正在嘗試打印C樣式的字符串,並打印所有字符,直到找到0x00。由於你沒有初始化分配的內存,它會打印出隨機垃圾。

+0

是什麼做的C++方式:'(無效*)C'? –

+1

這將是'reinterpret_cast (c)'。 – Mat

+2

@hexa:儘管@Mat是正確的,因爲'(void *)c'等價於'reinterpret_cast (c)',所以* C++的做法是'static_cast (c)'; –

0

由於c中沒有初始化char指向的字符,所以將一些隨機存儲器值轉儲,直到找到值爲0的值。它有時會崩潰,直到可讀的內存完成時才找到零。編寫這樣的代碼是禁止的,並且在Unix中也是錯誤的,以及任何其他操作系統。

0

char *實際上是一個C字符串。所以我猜測它試圖把它打印成一個字符串。給力的指針地址

一種方式進行印刷是用printf:

printf("%p\n", c);