🦀 Rust 指针类型快问快答

测试你对Rust指针类型的理解程度

10
题目数量
15
预计时间(分钟)
⭐⭐⭐
难度等级
第1题 (判断题)
在Rust中,引用(&T)和原始指针(*const T, *mut T)都是安全的。
正确
错误

答案解析:

答案:错误

引用(&T)是安全的,由借用检查器保证内存安全。

原始指针(*const T, *mut T)是不安全的,解引用时需要使用unsafe块。

原始指针可能指向无效内存,不受借用检查器约束。

第2题 (选择题)
下列哪个是Rust中的智能指针类型?
&T
Box<T>
*const T
*mut T

答案解析:

答案:Box<T>

Box<T>是Rust中最基本的智能指针,用于在堆上分配内存。

&T是引用,*const T和*mut T是原始指针,都不是智能指针。

其他智能指针还包括Rc<T>、Arc<T>、RefCell<T>等。

第3题 (选择题)
Rc<T>和Arc<T>的主要区别是什么?
Rc<T>用于堆分配,Arc<T>用于栈分配
Rc<T>是单线程的,Arc<T>是多线程安全的
Rc<T>可变,Arc<T>不可变
没有区别,只是名字不同

答案解析:

答案:Rc<T>是单线程的,Arc<T>是多线程安全的

Rc<T>(Reference Counted)只能在单线程中使用,引用计数操作不是原子的。

Arc<T>(Atomically Reference Counted)使用原子操作,可以在多线程间安全共享。

两者都用于共享所有权,但Arc<T>有额外的线程安全开销。

第4题 (判断题)
RefCell<T>允许在运行时进行可变借用检查,可以绕过编译时的借用规则。
正确
错误

答案解析:

答案:正确

RefCell<T>提供内部可变性,将借用检查从编译时推迟到运行时。

如果违反借用规则(如同时存在多个可变借用),程序会在运行时panic。

这允许在某些编译器无法验证安全性的情况下实现可变性。

第5题 (选择题)
以下代码的输出是什么?
let x = 42; let ptr = &x as *const i32; println!("{:p}", ptr);
42
内存地址
编译错误
运行时panic

答案解析:

答案:内存地址

{:p}格式化符用于打印指针的内存地址。

&x as *const i32将引用转换为原始指针。

输出类似于"0x7fff5fbff6ac"的十六进制地址。

第6题 (判断题)
Weak<T>是Arc<T>的弱引用版本,不会增加引用计数,可以用来打破循环引用。
正确
错误

答案解析:

答案:正确

Weak<T>是Arc<T>的弱引用,不会阻止值被释放。

当所有强引用(Arc)被释放后,即使还有弱引用存在,值也会被释放。

这是解决循环引用问题的重要工具,避免内存泄漏。

第7题 (选择题)
在unsafe块中解引用原始指针时,需要程序员保证什么?
指针指向的类型正确
指针不为空且指向有效内存
内存对齐正确
以上所有

答案解析:

答案:以上所有

解引用原始指针时,程序员必须保证:

1. 指针不为空且指向有效的、已分配的内存

2. 指针指向的类型与声明的类型匹配

3. 内存对齐符合类型要求

4. 在指针生命周期内,内存不会被释放或重新分配

第8题 (简答题)
什么是"悬垂指针"(dangling pointer)?请简要说明。

答案解析:

答案:指向已被释放内存的指针

悬垂指针是指向已经被释放或无效内存位置的指针。

在Rust中,借用检查器防止创建悬垂引用,但原始指针仍可能悬垂。

使用悬垂指针会导致未定义行为,可能造成程序崩溃或数据损坏。

第9题 (选择题)
以下哪种情况下应该使用Box<T>?
需要多个所有者时
数据太大不适合放在栈上时
需要线程间共享时
需要内部可变性时

答案解析:

答案:数据太大不适合放在栈上时

Box<T>主要用于:

1. 将大型数据移到堆上,避免栈溢出

2. 创建递归数据结构(如链表、树)

3. 当编译时不知道类型大小时

多个所有者用Rc<T>,线程共享用Arc<T>,内部可变性用RefCell<T>。

第10题 (简答题)
Cell<T>和RefCell<T>的主要区别是什么?

答案解析:

答案:Cell<T>只适用于Copy类型,RefCell<T>可以借用任何类型

Cell<T>:

- 只能用于实现Copy trait的类型

- 通过get()和set()方法操作,总是移动或复制值

- 零运行时开销,无借用检查

RefCell<T>:

- 可用于任何类型

- 通过borrow()和borrow_mut()方法借用

- 有运行时借用检查开销

🎉
恭喜完成测验!
10/10
你对Rust指针类型的掌握非常出色!