我注意到
rust-lldb
根据上下文以不同的方式漂亮地打印数组:
1 fn init(array: &mut[i32; 9]) {
2 array[4] = 333;
-> 3 }
4
5 fn main() {
6 let mut array: [i32; 9] = [18; 9];
7 init(&mut array);
(lldb) p array[0]
(int[9]) {
[0] = 18
[1] = 18
[2] = 18
[3] = 18
[4] = 333
[5] = 18
[6] = 18
[7] = 18
[8] = 18
}
当我走出
init
时,我得到了不同的打印格式:
4
5 fn main() {
6 let mut array: [i32; 9] = [18; 9];
-> 7 init(&mut array);
8 println!("{}", array[4]);
9 }
Target 0: (main) stopped.
(lldb) p array[0]
(int) 18
(lldb) ### x/9u &array <--- this works fine
打印格式如何在这些上下文之间发生变化?
// main.rs
fn init(array: &mut[i32; 9]) {
array[4] = 333;
}
fn main() {
let mut array: [i32; 9] = [18; 9];
init(&mut array);
println!("{}", array[4]);
}
编译并运行:
$ rustc -g main.rs
$ rust-lldb --source ./commands.dbg ./main
这是确切的命令:
# commands.dbg
b main.rs:3
run
p array[0]
next
p array[0]
### x/9u &array <--- this works fine
LLDB 以以 C 为中心的方式看待事物,而自然的 Rust 语法却掩盖了这一点。
这些情况之间的区别在于,类型
array
是 &mut [i32; 9]
中断点处的 init
,但其 [i32; 9]
位于 main()
中的下一步。在底层,&mut
引用只是一个指针,LLDB在查看p array
时会这样说:
// in init()
(lldb) p array
(int (*)[9]) $2 = 0x00007fffffffdba4
// in main()
(lldb) p array
(int [9]) $5 = {
[0] = 18
[1] = 18
[2] = 18
[3] = 18
[4] = 333
...
请注意
int (*)[9]
(指向 int
数组的指针)和 int [9]
(int
数组)之间的区别。
所以当你打印
array[0]
时,它们会做不同的事情。在 init()
中,您只是取消引用引用,从而打印数组本身(因为这就是 [0]
在 C 中的工作方式),而在 main()
中,您只是访问数组的第一个元素:
// in init()
(lldb) p array[0]
(int [9]) $0 = {
[0] = 18
[1] = 18
[2] = 18
[3] = 18
[4] = 333
...
// in main()
(lldb) p array[0]
(int) $6 = 18
您的
x/9u &array
中的 main()
本质上为您提供与简单的 p array
相同的功能,只是更加冗长。