gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:29:37 25 4
gpt4 key购买 nike

我试图在 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 - 使用 Rust 数据修改 C 函数中的内容会产生未知值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49717806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com