c++ - 奇怪的控制台输出

标签 c++ visual-studio-2010 character-encoding console

对于一个学校项目,我们必须使用指针,为此我想查看内存的地址,但是...... 当我使用下一段代码时:

int _tmain(int argc, _TCHAR* argv[]){
  char a;
  char b;
  char * pa;
  char * pb;
  pa = &a;
  pb = &b;
   
  cout << "adress pa "<< pa <<endl;
  cout << "adress pb "<< pb <<endl;

  cout << "a is  " << a << endl;
  cout << "b is  " << b << endl;

我得到这个作为输出: enter image description here

这是字符集问题吗?最重要的是我可以更正吗?

我测试了另一段代码:

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{int x = 25;
int * p;
p = &x;
cout << "adres" << p << endl;
*p = 10;
cout << "x"<< x << endl;
cin.get();

    return 0;
}

并且输出是可读的: enter image description here

有什么不同?

最佳答案

这是因为您正在取消引用未初始化的指针。这是未定义的行为。

<< 的重载之一C++ 标准库中的运算符解释 char*作为 C 字符串,而不是指针。因为您的 C 字符串未初始化,<<运算符(operator)打印垃圾。 int* 没有类似的重载这会将它解释为指针以外的任何东西,因此您会在第二种情况下看到正确的行为。

如果您不想要您的 char*要解释为 C 字符串的指针,请将指针指向 void* .

cout << hex << static_cast<void*>(pa) << endl;

(hex 让您可以使用更传统的 base-16 表示法显示指针。

关于c++ - 奇怪的控制台输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9555299/

相关文章:

c++立陶宛语,如何获得比ascii更多的内容

c++ - 为什么 `function<void (string)>` 和 `function<string (string)>` 参数类型有时对重载不明确?

c++ - 在 C++ 中使用 3X3 低通滤波器对 .pgm 图像进行卷积

c# - 使用 VSPackage 从 Visual Studio 工具窗口突出显示代码窗口文本

c# - 在 C# 中按 X 或 Close() 时 WinForms Form 不会关闭

visual-studio-2010 - 如何允许 msi 安装程序安装旧版本而不是新版本?

c++ - 如何理解函数ostream& operator<< (ostream& os, const unsigned char* s)

C++ 如何遍历对象的 std::vector 并在控制台上显示内容

java - 使用日语框架文件进行 ISO 编码

javascript - 正则表达式 - 特殊元音不被识别为单词字符