Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;初始化char[]和char之后,char将显示在char[]中_C++_Lldb - Fatal编程技术网

C++ C++;初始化char[]和char之后,char将显示在char[]中

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

我最近在学习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
的类型为
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。