C ++中字符的指针

时间:2016-06-10 14:35:36

标签: c++

通过书籍,第一个cout行应该打印出存储 char变量b 的位置的地址,这似乎是 int变量a <的情况/ strong>也是。但第一个cout语句打印出一个奇怪的&#39; dh ^#&#39; ,而第二个语句正确打印十六进制值&#39; ox23fd68&#39; 即可。为什么会这样?

 #include<iostream>
    using namespace std;

    int main()
    {
        char b='d';
        int a=10;
        char *c=new char[10];
        c=&b;
        int *e=&a;
        cout<<"c: "<<c<<endl;
        cout<<"e: "<<e;
    }

2 个答案:

答案 0 :(得分:5)

const char*类型有一个非成员重载operator<<(std::basic_ostream),它不写地址,而是(假定的)C风格的字符串 1)。在您的情况下,由于您已分配单个字符的地址,因此没有NUL终结符,因此没有有效的C样式字符串。代码展示undefined behavior

int*的行为是不同的,因为对int的指针没有特殊处理,并且语句按预期将地址写入流。

如果您想获取角色的地址,请使用static_cast

std::cout << static_cast<void*>( c ) << std::endl;

<小时/> 1) C风格的字符串是一系列字符,以NUL字符('\0')结尾。

答案 1 :(得分:4)

实际上这个程序有问题。内存泄漏。

char *c=new char[10];
c=&b;

这会在堆上分配10个字符,但是使用变量b的地址覆盖指向堆的指针。

char*cout写入operator<<时,它被视为空终止的C字符串。当b的地址初始化为包含d op<<的单个字符时,继续在堆栈上搜索找到第一个空字符。它似乎是在几个字符之后找到的,因此dh^#被写入(d是变量b的值,其余的只是在第一个之前在堆栈上找到的一些随机字符\0 char)。

如果您想获取地址,请尝试使用static_cast<void*>(c)

我的例子:

int main() {
  char *c;
  char b = 'd';
  c = &b; 
  cout << c << ", " << static_cast<void*>(c) << endl;
}

输出:

dÌÿÿ, 0xffffcc07

在'd'之后看到奇怪的字符。

我希望这会有所帮助!