C++ 初始化 char[] 和 char 后,char 显示在 char[]

C++ after initialize char[] and char , char shows in the char[]

最近在学习Cpp,今天在使用Clion学习做一些测试的时候发生了奇怪的事情。

这是我的代码


int main() {
    char c = 'b';
    char carr[1]{'a'};
    char *p1 =&(carr[0]);
    char *p2 =&c;
    return 0;
}

编译者:

4.2.1 兼容的 Apple LLVM 11.0.0 (clang-1100.0.33.8)

lldb :

这里是内存的详细信息:

请帮我分析一下原因!

变量 carr 的类型 char[1] 衰减为 char*。 尝试打印 char* 时,您的调试器会一直打印字符,直到它到达空终止符 [=14=].

并不是说 carr 包含 "ab",而是任何查看 carr 的函数都会假定它包含。这是因为数组的边界在传递给另一个函数时(几乎总是)被丢弃。

这是字符串的 lldb 数据格式化程序有点太急切了。

在调试器中查看 char 数组的人通常不希望将 char[N] 打印为 N 个字符的数组,他们希望将其视为字符串。所以 lldb 为 char[*] 提供了一个 "data formatter" ,将其呈现为 C 字符串。格式化程序确实应该在数组的长度处手动终止该字符串。您可以通过以下方式查看(过于简单的)数据格式化程序:

(lldb) type summary info carr
summary applied to (char [1]) carr is: `${var%s}` (hide value) (skip pointers)

它只是说从数组的开头开始并将内存打印为 C 字符串。

您可以在打印变量时使用 --raw 选项关闭 char 类型的数据格式化程序来查看真实数组:

(lldb) v --raw carr
(char [1]) carr = {
  [0] = 'a'
}