gpt4 book ai didi

c - 在Rust中创建一个c_void指针

转载 作者:行者123 更新时间:2023-12-03 11:41:24 26 4
gpt4 key购买 nike

我有一个输入类型为ptr::NonNull<c_void>的函数。通常,此输入由C代码提供。合法输入的类型为&(int){5}

但是,我需要在Rust中创建一些输入。所以我做了以下事情:

let i = 5;
let data = &i as *const u32;
ptr::NonNull::new_unchecked(data as *mut _)

如果从C代码合法输入,则执行以下块:
ptr::NonNull::new_unchecked(x.data as *mut _)

其中 x.data来自结构,其中 xX类型:
#[repr(C)]
pub struct X {
data: *const c_void,
}

供引用,代码看起来像这样:
if x.data.is_null() {
let i = 5;
let data = &i as *const u32;
ptr::NonNull::new_unchecked(data as *mut _)
} else {
// x.data is specified in C code through FFI as &(int){5}
ptr::NonNull::new_unchecked(x.data as *mut _)
}

但是,当我稍后尝试取消引用该值时,对于 else分支,将按预期方式获得 5。但是对于 if分支,我得到了很大的垃圾值。我假设它与我在Rust中创建原始指针的方式有关。

最佳答案

if分支中,您将创建一个本地范围的变量i,获取一个指向它的指针(引用),并将该引用传递给new_unchecked,后者不会复制您的数据,它只是封装了指针,然后将您传递给您的范围之外。

在程序的稍后部分,您尝试访问不再在范围内的数据,因此将获得未指定的数据。

尝试在 Box 中定义数据并使用 into_raw() 获取指针

编辑:
实际上,像这样的东西可能会更好:

let val = if x.data.is_null() {
5
} else {
*x.data
};
let data = &val as *const u32;
ptr::NonNull::new_unchecked(data as *mut _)

这将分配从封闭块中取出。

关于c - 在Rust中创建一个c_void指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61691415/

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