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'
}
最近在学习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'
}