C ++指针的打印值给出了奇怪的结果

时间:2011-06-22 13:51:43

标签: c++ pointers

当我编译并运行这个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的值打印为一行随机字符。

请有人解释为什么它没有正确打印char数组的指针。

由于

4 个答案:

答案 0 :(得分:19)

operator << std::ostreamstd::wostream以特殊方式定义了char指针(char*const char*wchar_t*和{{1}打印出以空字符结尾的字符串。这使您可以编写

const wchar_t*

并在你的标准输出上看到一个很好的字符串。

要获取指针值,请转换为const char* str = "Hello, World"; std::cout << str;

void *

答案 1 :(得分:4)

operator<<的{​​{1}}已超载。它会考虑您正在尝试打印C风格的字符串,并打印所有字符,直到找到char*。由于你没有初始化分配的内存,它会打印掉随机垃圾。

答案 2 :(得分:0)

由于c指向的char中没有初始化,因此您会转储一些随机内存值,直到找到值为0的值。它有时会崩溃,直到您的可读内存完成时才会找到零。在Unix中以及在任何其他操作系统中编写这样的代码是被禁止的和错误的

答案 3 :(得分:0)

char *实际上是一个C字符串。所以我猜它是试图将它打印成一个字符串。

强制打印指针地址的一种方法是使用printf:

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