使用 Rust 数据修改 C 函数中的内容会产生未知值

Modifying content in C function with Rust data produces unknown values

我试图在 Rust 中调用 C 函数,但遇到了一个奇怪的问题。此代码重现了我的问题:

C

int t(uint8_t *data){
    *data = 1;
    *(data+1) = 2;
    *(data+2) = 3;
}
// block1
unsafe {
    let data = Vec::with_capacity(1024).as_mut_ptr();
    t(data);
    println!("{:?}", Vec::from_raw_parts(data, 4, 4));
}

// block2
unsafe {
    let mut data: Vec<u8> = Vec::with_capacity(1024);
    let pdata = data.as_mut_ptr();
    t(pdata);
    println!("{:?}", Vec::from_raw_parts(pdata, 4, 4));
}

我希望输出为 [1, 2, 3, 0]

只有 "block2" 有效,"block1" 输出 [91, 57, 49, 44]。我不知道那是从哪里来的。

最令人困惑的是,当我把"block1"放在"block2"和运行后面时,它们都正确输出[1, 2, 3, 0]

我没有注意到什么?两个block有什么区别?

相信这里发生的事情是

let data = Vec::with_capacity(1024).as_mut_ptr();

这最终会产生未定义的行为。在这里,Vec<T> 是临时的,因此将在该行运行后释放其内存,因此您传递了一个指向 C.

的错误指针

移动代码时得到不同的结果似乎也暗示这里有 UB。