使用 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。
我试图在 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。