面试题答案
一键面试- 索引越界访问:
- 场景:在使用索引访问
Vec
、String
等集合类型元素时,若索引值超过集合的有效范围。例如let v = vec![1, 2, 3]; let value = v[10];
- 原因:Rust 为了保证内存安全,不允许访问无效内存。当索引超出集合长度时,会触发
panic
,因为这意味着程序试图访问不属于该集合的内存区域,可能导致未定义行为。
- 场景:在使用索引访问
- 解引用空指针:
- 场景:使用
*
操作符解引用一个Option<&T>
类型中None
值对应的指针。例如let opt: Option<&i32> = None; let value = *opt.unwrap();
- 原因:
None
表示没有值,解引用它相当于尝试访问不存在的内存地址,这是不安全的,会触发panic
以避免程序崩溃或未定义行为。
- 场景:使用
- 算术运算溢出:
- 场景:在进行整数算术运算时,如果结果超出了该整数类型所能表示的范围。例如
let a: u8 = u8::MAX; let b = a + 1;
- 原因:Rust 默认情况下,整数运算溢出会触发
panic
,以防止得到不正确的结果。这有助于在开发过程中尽早发现潜在的问题,避免因溢出导致程序逻辑错误。
- 场景:在进行整数算术运算时,如果结果超出了该整数类型所能表示的范围。例如
- 调用
unwrap
方法处理Result
或Option
的错误值:- 场景:对一个包含错误的
Result
值调用unwrap
方法,或者对None
的Option
值调用unwrap
。例如let res: Result<i32, &str> = Err("error"); let value = res.unwrap();
- 原因:
unwrap
方法的设计目的是在Result
为Ok
或Option
为Some
时返回内部值。当遇到错误值(Err
或None
)时,调用unwrap
会触发panic
,因为程序预期得到的是正确的值,但实际遇到了错误情况。
- 场景:对一个包含错误的