为什么下面的代码打印“AA”而不是“A”?

bha*_*hir -1 c++ type-conversion

此代码给出输出“AA”。为什么此代码不打印“A”?

    int i = 65;
  char c = i;
  int *p = &i;
  char* pc = &c;
  cout << pc << endl;
Run Code Online (Sandbox Code Playgroud)

Sha*_*ger 6

i在堆栈“之后” c;当您打印 a 时,char*它会将其视为以 -NUL结尾的字符串。你的机器是小端的,所以内存布局是:

65 65 0 0 0
 c  i i i i
Run Code Online (Sandbox Code Playgroud)

由于 65 是 letter 的 ASCII 序号,因此A读起来像一个字符串"AA"(有几个额外的尾随NULs 被忽略),并按原样打印。c从指针读取的结果是未定义的行为,并且只是巧合(你很幸运编译器如何布置内存);永远,永远不要依赖它。

如果您只想打印A,只需pc在打印时取消引用:

cout << *pc << endl;
        ^ dereferences pc to print only the single character it points to
Run Code Online (Sandbox Code Playgroud)

  • @NathanPierson:很可能,编译器选项的某些组合(与堆栈安全、变量对齐等相关)会使其无法在OP的机器上工作,或者在您的机器上工作。不管怎样,都不值得冒鼻恶魔的风险。 (2认同)