2011-06-22 51 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);