4. 元组与数组 创建元组和数组,访问元素,并演示数组越界时的编译或运行错误。

任务说明

本案例将完成三项核心任务:创建元组和数组、通过索引访问元素、演示数组越界时的编译错误。你将直接编写并运行一段Rust代码,观察编译器对越界访问的静态检查行为。

代码实现

fn main() {
    // ---------- 元组创建与访问 ----------
    // 元组可以包含不同类型的数据
    let tuple: (i32, f64, &str) = (42, 3.14, "Rust");
    
    // 使用点号加索引访问元组元素(索引从0开始)
    let first = tuple.0;
    let second = tuple.1;
    let third = tuple.2;
    
    println!("元组第一个元素: {}", first);
    println!("元组第二个元素: {}", second);
    println!("元组第三个元素: {}", third);
    
    // 元组解构
    let (a, b, c) = tuple;
    println!("解构后: a={}, b={}, c={}", a, b, c);
    
    // ---------- 数组创建与访问 ----------
    // 数组所有元素必须类型相同,长度固定
    let array: [i32; 5] = [10, 20, 30, 40, 50];
    
    // 使用方括号加索引访问数组元素
    println!("数组第一个元素: {}", array[0]);
    println!("数组第三个元素: {}", array[2]);
    println!("数组最后一个元素: {}", array[4]);
    
    // 遍历数组
    for element in array.iter() {
        print!("{} ", element);
    }
    println!();
    
    // ---------- 数组越界演示 ----------
    // 下面这行代码访问索引5(数组长度为5,有效索引为0~4)
    // 这会导致编译错误:index out of bounds
    let out_of_bounds = array[5];
    println!("越界访问结果: {}", out_of_bounds);
}

编译与运行

将上述代码保存为 main.rs,在终端执行 rustc main.rs 进行编译。你会看到编译器输出类似以下错误信息:

error: this operation will panic at runtime
 --> main.rs:30:31
  |
30 |     let out_of_bounds = array[5];
  |                               ^ index out of bounds: the length is 5 but the index is 5
  |
  = note: `#[deny(unconditional_panic)]` on by default

这是Rust编译器在编译阶段就检测到了越界访问,并直接拒绝生成可执行文件。这是Rust内存安全保证的核心体现——越界错误不会留到运行时才暴露。

验证与判定标准

完成以下步骤即可判定本案例通过:

  1. 将代码中越界访问行(let out_of_bounds = array[5];)注释掉,重新执行 rustc main.rs,编译成功后会生成可执行文件;
  2. 运行 ./main,观察输出:应依次打印元组的三个元素、解构后的三个变量、数组的首/中/尾元素,以及遍历输出的 10 20 30 40 50;
  3. 恢复越界访问行,再次执行 rustc main.rs,确认编译器报错且不生成可执行文件——这证明越界在编译期即被拦截。
Rust 元组与数组内存布局及越界检测 元组 (i32, f64, &str) tuple.0 42 (i32) tuple.1 3.14 (f64) tuple.2 "Rust" (&str) 访问方式:点号 + 索引,如 tuple.0 数组 [i32; 5] [0] 10 [1] 20 [2] 30 [3] 40 [4] 50 越界! 访问方式:方括号 + 索引,如 array[2] 编译错误(array[5] 越界) error: this operation will panic at runtime index out of bounds: the length is 5 but the index is 5 Rust 安全保证:越界在编译期即被拦截,不会进入运行时 ✓ 元组:不同类型可共存,长度固定,用 .0 .1 .2 访问 ✓ 数组:同类型元素,长度固定,用 [0] [1] [2] 访问