Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 是否有一种通用的Rust指针类型可以存储任何其他类型的指针,类似于C';什么是空*?_Pointers_Rust - Fatal编程技术网

Pointers 是否有一种通用的Rust指针类型可以存储任何其他类型的指针,类似于C';什么是空*?

Pointers 是否有一种通用的Rust指针类型可以存储任何其他类型的指针,类似于C';什么是空*?,pointers,rust,Pointers,Rust,我想为我的板条箱创建一个C FFI API,但不清楚投射指针有多安全。伪代码: #[no_mangle] extern "C" fn f(...) -> *mut c_void { let t: Box<T> = ...; let p = Box::into_raw(t); p as *mut c_void } #[无损坏] 外部“C”fn f(…)->*多个C_void{ 设t:Box=。。。; 设p=Box::in_raw(t); p as*mut

我想为我的板条箱创建一个C FFI API,但不清楚投射指针有多安全。伪代码:

#[no_mangle]
extern "C" fn f(...) -> *mut c_void {
    let t: Box<T> = ...;
    let p = Box::into_raw(t);
    p as *mut c_void
}
#[无损坏]
外部“C”fn f(…)->*多个C_void{
设t:Box=。。。;
设p=Box::in_raw(t);
p as*mut c_void
}
这与预期一样有效,但安全性如何?在C或C++中,有特殊的<代码> Value*/Cuff>指针,C++标准声明它是安全的。潜在地,
sizeof(void*)
可能不等于
sizeof(T*)
,但可以保证
sizeof(void*)
=
sizeof(T*)

生锈呢?指针的
std::mem::size\u或指针之间的安全强制转换是否有任何保证?或者所有指针在实现上都具有相同的大小,等于
usize

所谓“通用”,我的意思是你可以转换
X*
,而不会丢失任何东西。我不关心类型信息;我关心指向不同事物的不同大小的指针,比如16位天数中的
/
指针

4.10说

将“指向cv T的指针”转换为“指向cv void的指针”的结果指向T类型对象所在的存储位置的起点

不可能有
sizeof(void*)
,因为这样就不可能有存储位置的真实地址

没有

Rust的原始指针(和引用)目前有两种风格:

  • 精简(一个本机大小的整数)
  • fat(两个本机大小的整数)
error[E0512]:无法在不同大小的类型之间转换,或在不同大小的类型之间转换
-->src/main.rs:4:11
|
4 |脂肪=膜::转化(瘦);
|           ^^^^^^^^^^^^^^
|
=注意:源类型:`*const u8`(64位)
=注:目标类型:`*const[u8]`(128位)
错误[E0512]:无法在不同大小的类型之间转换,或在依赖大小的类型之间转换
-->src/main.rs:5:12
|
5 |瘦=mem::转化(脂肪);
|            ^^^^^^^^^^^^^^
|
=注:源类型:`*const[u8]`(128位)
=注意:目标类型:`*const u8`(64位)
由于fat指针的布局是一个特定的概念,因此决不能通过FFI访问它们。这意味着只应使用细指针,所有指针都具有统一的已知大小

对于这些类型,您应该使用,以提供更好的类型安全性。您还可以使用
*const()

另见:

<>在C或C++中,有特殊的<代码> Value*/Cuff>指针,C++标准声明它是安全的。 这并不总是正确的:


你不会在生锈中的指针之间转换(而且C++也不这样做!)取而代之的是使用特质。我看不出这个问题与外国金融机构有什么关系。请澄清您的问题。“Rust C FFI通用指针类型,类似于“void*”?“no no,no,抱歉;”)
void*
不是“神奇”指针,它不是“通用”指针。这是一个无指针类型。一个人必须知道它是真正的类型才能使用它。没有通用的,结构a的
指针
不能转换为
void*
,然后再转换为结构B的
指针。所以这显然不是普遍的。当然,我的笔记很迂腐,但要知道这一点很重要。@hellow
t因为*mut c_void
是由指针组成的,从我的观点来看,你想要什么术语?“但是可以保证
sizeof(void*)>=sizeof(t*)
”,你能引用这样的标准吗?在C中,我真的怀疑这一点,我不知道C++。@ StAdGuuru通用性,你可以转换<代码> x*<代码>而不丢失任何东西,实际上我不在乎胖指针。我关心的是
size\u of
*mut T1
size\u of
*mut T2
不相等的情况。在C/C++标准中,没有保证指针大小相等的保证,只有保证可以在不丢失信息的情况下将指针转换为void*
。所以在Rust中,所有普通指针的大小都是相同的?@user1244932没有Rust标准,所以不可能100%确定地陈述,但据我所知,是的,所有细指针的大小都是相同的。
use std::mem;

fn main() {
    println!("{}", mem::size_of::<*const u8>());   //  8
    println!("{}", mem::size_of::<*const [u8]>()); // 16
}
use std::mem;

unsafe fn example(mut thin: *const u8, mut fat: *const [u8]) {
    fat = mem::transmute(thin);
    thin = mem::transmute(fat);
}