C++ C++;初始化char[]和char之后,char将显示在char[]中
我最近在学习Cpp,今天我用Clion学习做一些测试,奇怪的事情发生了 这是我的密码C++ C++;初始化char[]和char之后,char将显示在char[]中,c++,lldb,C++,Lldb,我最近在学习Cpp,今天我用Clion学习做一些测试,奇怪的事情发生了 这是我的密码 int main() { char c = 'b'; char carr[1]{'a'}; char *p1 =&(carr[0]); char *p2 =&c; return 0; } 编者: 4.2.1兼容苹果LLVM 11.0.0(clang-1100.0.33.8) lldb: 以下是内存的详细信息: 请帮我找出原因 变量carr的类型为c
int main() {
char c = 'b';
char carr[1]{'a'};
char *p1 =&(carr[0]);
char *p2 =&c;
return 0;
}
编者:
4.2.1兼容苹果LLVM 11.0.0(clang-1100.0.33.8)
lldb:
以下是内存的详细信息:
请帮我找出原因 变量
carr
的类型为char[1]
,它会衰减为char*
。
当试图打印字符*
时,调试器会一直打印字符,直到到达空终止符\0
这并不是说
carr
包含“ab”
,而是任何查看carr
的函数都会假设它包含。这是因为数组的边界(几乎总是)在传递给另一个函数时被丢弃。变量carr
的类型为char[1]
,它会衰减为char*
。
当试图打印字符*
时,调试器会一直打印字符,直到到达空终止符\0
这并不是说
carr
包含“ab”
,而是任何查看carr
的函数都会假设它包含。这是因为数组的边界(几乎总是)在传递给另一个函数时被丢弃。这是lldb数据格式化程序,因为字符串有点过于急切
在调试器中查看char数组的人通常不希望char[N]打印为N个char的数组,他们希望将其视为字符串。因此,lldb为char[*]提供了一个“数据格式化程序”,将其表示为C字符串。格式化程序实际上应该在数组长度处手动null终止该字符串。您可以通过以下操作查看(过于简单的)数据格式化程序:
(lldb) type summary info carr
summary applied to (char [1]) carr is: `${var%s}` (hide value) (skip pointers)
它只是说从数组的开头开始,并将内存打印为C字符串
打印变量时,通过使用--raw选项关闭字符类型的数据格式化程序,可以查看实际数组:
(lldb) v --raw carr
(char [1]) carr = {
[0] = 'a'
}
这是lldb数据格式化程序,用于有点过于急切的字符串 在调试器中查看char数组的人通常不希望char[N]打印为N个char的数组,他们希望将其视为字符串。因此,lldb为char[*]提供了一个“数据格式化程序”,将其表示为C字符串。格式化程序实际上应该在数组长度处手动null终止该字符串。您可以通过以下操作查看(过于简单的)数据格式化程序:
(lldb) type summary info carr
summary applied to (char [1]) carr is: `${var%s}` (hide value) (skip pointers)
它只是说从数组的开头开始,并将内存打印为C字符串
打印变量时,通过使用--raw选项关闭字符类型的数据格式化程序,可以查看实际数组:
(lldb) v --raw carr
(char [1]) carr = {
[0] = 'a'
}
至少关于第一张图片:请不要在图片中发布纯文本。将其复制粘贴到问题中。请参阅。
一些测试奇怪的事情
请详细说明更具体的问题,什么是奇怪的?LLDB期望carr
以null结尾,并且在尝试查找null终止符时超出范围。巧合的是,c
恰好在内存中的carr
之后结束,而c
@HolyBlackCat之后有一个空字节。为什么lldb不识别该类型是数组类型而不是指针,并假定其长度(在p carr
的情况下)?gdb只打印数组内容。@walnut,因为我想这很愚蠢?至少关于第一张图片:请不要在图片中发布纯文本。将其复制粘贴到问题中。请参阅。一些测试奇怪的事情
请详细说明更具体的问题,什么是奇怪的?LLDB期望carr
以null结尾,并且在尝试查找null终止符时超出范围。巧合的是,c
恰好在内存中的carr
之后结束,而c
@HolyBlackCat之后有一个空字节。为什么lldb不识别该类型是数组类型而不是指针,并假定其长度(在p carr
的情况下)?gdb只打印数组内容。@walnut,因为我想这很愚蠢?但OP不想打印数组。他们向调试器询问其内容,调试器知道确切的类型char[1]
。为什么LLDB决定把它当作一个指针来打印,而不是打印我认为更合理的实际数组内容?根据我的测试,GDB遵循后面的逻辑。我猜这是LLDB中的一个bug。但是OP并没有试图打印数组。他们向调试器询问其内容,调试器知道确切的类型char[1]
。为什么LLDB决定把它当作一个指针来打印,而不是打印我认为更合理的实际数组内容?根据我的测试,GDB遵循后面的逻辑。我猜这是LLDB中的一个bug。