首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么盒子指针会传递给C语言,然后返回给Rust segfault?

盒子指针传递给C语言然后返回给Rust segfault的原因是因为在C语言和Rust之间进行指针传递时,存在不兼容的内存管理机制和类型系统。

首先,C语言使用的是手动内存管理,而Rust使用的是所有权系统和借用检查器来确保内存安全。当将盒子指针传递给C语言时,C语言可能会对指针进行修改或释放,而Rust并不知道这些变化。当Rust试图使用已经被修改或释放的指针时,就会导致段错误(segfault)。

其次,C语言和Rust的类型系统也不兼容。C语言中的指针可以指向任何类型的数据,而Rust的类型系统要求在编译时就确定指针的类型。当将盒子指针返回给Rust时,Rust无法确定指针的具体类型,无法进行正确的类型检查和内存管理,从而导致段错误。

为了解决这个问题,可以使用FFI(Foreign Function Interface)来在C语言和Rust之间进行交互。FFI提供了一组规范和工具,用于在不同编程语言之间进行函数调用和数据传递。通过使用FFI,可以确保在C语言和Rust之间正确地传递指针和数据,并避免段错误的问题。

总结起来,盒子指针传递给C语言然后返回给Rust segfault的原因是C语言和Rust之间的内存管理机制和类型系统不兼容。为了解决这个问题,可以使用FFI来进行跨语言交互。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Rust 编程学习笔记Day 3-变量所有权及生命周期

然后把他们2个传递给find_pos函数, 在data中查找v 是否存在,如果存在返回下标,不存返回None。 find_pos最后一个语句 None 直接返回,不用return。...按大多数编程语言的做法,现在 data 就有2个引用了。且每当把data作为参数传递一次,就会多一个引用。 那么问题来了:堆上的内存什么时候释放? C/C++:手动处理释放,占用码农心智。...那么Rust是怎么解决的?之前我们开发的时候,引用是一种随意、可隐式产生的行为。比如C语言里到处乱飞的指针。比如Java里随处可见的按引用参。而Rust决定限制开发者随意引用的行为。...比如以下情况: 变量A被赋 变量B。 变量A作为参数被传递给函数C。 作为返回值从函数D返回。 对于上面这些情况,Rust制定了一些规则: 一个值只能被一个变量所拥有,这个变量被称为所有者。...规则2里 讲的是所有权转移是Move语义,这个概念Rust是从C++那里借鉴的。 规则3里 提到的作用域(scope)是一个新概念,在Rust里主要是指{} 里的代码区,区分与其他语言一般是函数。

56840

我也谈 Box智能指针·实践领悟

Box也是FFI按【引用】值的C ABI指针 — 即,它是Box::into_raw(Box) -> *mut T的语法糖。...场景一·技术细节·展开 就Rust FFI导出函数而言,函数返回值可直接使用Box作为返回值类型,而不是原始指针*mut T [例程1]。...它完成的任务可被拆解为: 将【栈·数据】搬移至【堆】内存上 — 只有【堆·数据】才能被传递给C端,因为 【栈·数据】随着函数执行结束而被【栈pop操作】释放掉 【堆·数据】可以被假装释放和不再被追踪...返回【原始指针】作为函数返回值 上面看似繁复的处理流程,以Rust术语,一言概之:将·变量值·的【所有权】从FFI的Rust端转移至C调用端。或称,穿越FFI边界的变量【所有权】转移。...Rust端Borrow Checker也开始“抱怨”任何对C端变量值有【内存泄漏风险】的操作语句。在Rust词典中,对此有一个术语叫Hygienic — 我打趣地将它翻译为“大保健”。

67720
  • C语言作业详解12_17(题型对应知识点)

    实参可以为常量、变量和表达式,无论是哪个只要可以向形参值都可以。 B、错误。形参不能为表达式,在C语言中,形参可以是变量或指针,但不能是常量或表达式。形参用于接收函数调用中传递的实际参数的值。...函数说明是返回值为void 类型的函数,但是在函数调用语句那里是将返回值赋k,所以k不会被赋值,矛盾由此而来。 D、错误。函数名可以用下划线。...函数调用虽然不能直接作为一个函数的形参,但可以定义函数指针作为形参,然后将函数调用通过函数指针递给该形参。 五、函数命名 A、错误。...C、正确。 D、错误。不符合C语言的语法规范 六、参方式 A. 地址传递:地址传递是指将实参的地址传递给形参,形参通过该地址可以直接访问和修改实参的值。在C语言中,可以通过传递指针来实现地址传递。...如果需要其他传递方式,可以通过传递指针或引用等方式来实现。选项 D. 传递方式由用户指定 不是正确答案,因为在通常情况下,如果不特别指定,C语言函数调用采用单向值传递。

    10810

    allwefantasy:Rust FFI 实践

    虽然在C里我们不能直接调用Predictor_t的方法,但是我们可以提供一些辅助方法将Predictor_t传递回Rust然后Rust调用里调用他的方法,最后返回结果。...如何在C/Rust之间传递指针 首先,Rust 的函数要返回一个指针,可以像下面那么做: #[no_mangle] pub extern "C" fn create_tensor(data: *const...那如何传递一个指针Rust函数呢?...所有权在Rust/C之间的转移 我们知道Rust是一门内存安全的问题,响应的有所有权和申明周期的问题。所以在做跨语言交互的过程遇到一些相关的问题。...总结 跨语言交互本身是比较难的,尤其是指针问题,这也是为什么C/C++更容易写出不安全的代码。我们应该尽量使用Rust Safe部分来完成我们的逻辑。

    84240

    Rust FFI 实践

    虽然在C里我们不能直接调用Predictor_t的方法,但是我们可以提供一些辅助方法将Predictor_t传递回Rust然后Rust调用里调用他的方法,最后返回结果。...如何在C/Rust之间传递指针 首先,Rust 的函数要返回一个指针,可以像下面那么做: #[no_mangle] pub extern "C" fn create_tensor(data: *const...那如何传递一个指针Rust函数呢?...所有权在Rust/C之间的转移 我们知道Rust是一门内存安全的问题,响应的有所有权和申明周期的问题。所以在做跨语言交互的过程遇到一些相关的问题。...总结 跨语言交互本身是比较难的,尤其是指针问题,这也是为什么C/C++更容易写出不安全的代码。我们应该尽量使用Rust Safe部分来完成我们的逻辑。

    1.1K20

    C++智能指针的正确使用方式

    同时也解释了为什么要用shared_from_this以及智能指针的函数参问题。 对象所有权 首先需要理清楚的概念就是对象所有权的概念。...所有权在rust语言中非常严格,写rust的时候必须要清楚自己创建的每个对象的所有权。 但是C++比较自由,似乎我们不需要明白对象的所有权,写的代码也能正常运行。...C++引入了智能指针,也是为了更好的描述对象所有权,简化内存管理,从而大大减少我们C++内存管理方面的犯错机会。...如何指针作为函数参 很多时候,函数的参数是个指针。...同时理解了每种智能指针背后的性能消耗、使用场景,那智能指针也不再是黑盒子和洪水猛兽。

    10K42

    Rust日报】2020-07-30 fixed_vec减少Rust数组冗余边界检查

    整个项目的逻辑是这样的: 门禁卡那有个树莓派,雇员拍一张照片,然后雇员的RFID 卡扫描以后,触发树莓派里的照片上传到S3,然后通过lambda根据雇员id,去另一个S3里调用员工的照片,然后用 第三方图片识别服务...,把树莓派拍摄的照片和S3里存储的照片进行相似性比对,返回一个分数,返回到树莓派上面,这个值大于一定值就开门。...Rust 团队想做的太多,但是他们低估了投入成本。 不过,steve表示, 我们应该有一个 Rust 2021 Edition。但它应该比Rust 2018更小的版本,小版本优点大于缺点。...但是,Rust 官方会在 10月份以后发布一个 RFC 的,目前主要是 Niko 和 Steve 在做这个,当然,Niko 还是主力担当。 为什么是三年呢?...中的函数指针魔法,写出了一个奇怪的东西 从代码看上去似乎是通过函数空指针调用了函数 代码Playground fn foo() { println!

    93120

    RUST 库中公开 FFI

    FFI 可用于加快程序执行(这在 Python 或 Ruby 这类动态语言中很常见),或者只是因为你想使用一些其他语言编写的库(例如 TensorFlow 的核心库是用 C++ 写的,并暴露了 C API...然后,我们在函数定义时,包含了两个额外的关键字 unsafe 和 extern。 extern 关键字使函数遵守 C 调用约定,你可以查看 Wikipedia 了解为什么要这样做。...例如,如果我的 Manager 结构中包含 Mutex,它应该如何用 C 或 Python 4。 这就是我为什么把结构体的实现隐藏在 不透明指针 背后的原因。...: Box = Box::new(manager); Box::into_raw(boxed) } 如你所见,它创建了一个 Manager, Box::new,将其移动到堆中,然后返回原始指针...在下面的例子中, battery.serial_number() 返回 Option,我们稍后将其转换为 CString,与之前的示例相同,我们将原始指针返回调用者。

    1.9K30

    Java的值调用

    FORTRAN II 是一种早期的引用调用语言。一些语言C++、PHP、Visual Basic .NET、C#和REALbasic默认使用值调用,但是提供一种引用的特别语法。...在那些使用值调用又不支持引用调用的语言里,可以用引用(引用其他对象的对象),比如指针(表示其他对象的内存地址的对象)来模拟。C和ML就用了这种方法。...这不是一种不同的求值策略(语言本身还是值调用)。它有时被叫做“地址调用”(call by address)。这可能让人不易理解。在C之类不安全的语言引发解引用空指针之类的错误。...= &x; modify(a, &b, c); // a是值调用, b通过创建指针实现引用传递,c是按值传递的指针 //b and x are changed return 0; } 共享对象调用...使用C/C++语言的程序员可能因不能用指针等使函数返回多个值而感到不便,但是像Python这样的语言提供了替代方案:函数能方便的返回多个值,比C++11的std::tie更加简单。

    3.5K20

    Rust学习】04_所有权

    从桌子 A 听一个菜,接着桌子 B 听一个菜,然后再桌子 A,然后再桌子 B 这样的流程更加缓慢。...需要一个当我们处理完 String 时将内存返回给分配器的方法。 第一部分由我们完成:当我们调用 String::from 时,它的实现请求它需要的内存。这在编程语言中几乎是通用的。...在具有垃圾回收器 (GC) 的语言中,GC 跟踪并清理不再使用的内存,我们不需要考虑它。...所有权和函数 将值传递给函数的机制类似于将值赋变量的机制。将变量传递给函数将移动或复制,就像赋值一样。下面有一个示例,其中包含一些注释,显示了变量进入和超出范围的位置。...如果我们还要接着使用它的话,每次都进去再返回来就有点烦人了,除此之外,我们也可能想返回函数体中产生的一些数据。

    6610

    Rust FFI 编程 - Rust导出共享库02

    我们首先回顾关于字符串的基础知识,了解其在RustC中的区别,然后设计具体的示例进行实践,并整理出传递字符串的FFI编程范式。 基础知识 在 C 语言中,字符串可看作是由字符组成的一维的字节数组。...一般用于和 C 语言交互,由 C 分配并被 Rust 借用的字符串; CString:表示拥有所有权的,中间没有空字节,以空字符终止的字符串类型。...一般用于和 C 语言交互时,由 Rust 分配并传递给 C 的字符串; 除此之外,从 Rust 的角度来讲,事实上有三种相关方式可以理解字符串:字节、标量值和字形簇( 字母 的概念)。...free_str函数供 C 端调用者将字符串返回 Rust 释放内存; 头文件如下: void print_str(char *str); char *change_str(char str[]);...使用std::ffi::CString提供的一对方法into_raw和from_raw可以进行原始指针转换,由于将字符串的所有权转移了调用者,所以调用者必须将字符串返回 Rust,以便正确地释放内存

    1K20

    Golang的逃逸分析和C以及Rust的此类问题的处理对比

    Golang的逃逸分析 首先抛出几个常见的问题: 用golang编程时是选用指针还是值?既然指针效率高,那是不是只要不涉及复制需求的情况下每次都采用指针传递?...一般情况下指针传递效率是高于值传递。因为拷贝整个对象,而指针只会拷贝指针地址,指向的对象是同一个。指针可以减少值的拷贝。...cRust以及golang 对 dangling reference 处理的对比 篇外话:c/rust/go/java这四门语言是云原生绕不开的四门语言。...rust是具备接近c的性能开销,但远高于c的开发效率,且天生适合review的现代语言。...就是一个指针,它引用的内存已经被释放,但是,指向该内存的指针保留在程序中。

    63020

    泛型和元编程的模型:Java, Go, Rust, Swift, D等

    我将从C这样的不具备泛型系统的语言如何解决这个问题开始,然后分别展示其他语言如何在不同的方向上逐渐添加扩展,从而发展出各具特色的泛型系统。...装箱是指我们把所有的东西都放在统一的 "盒子 "里,使它们的行为方式都一样。通常是通过在堆上分配内存,只在数据结构中放指针来实现的。...字典传递 除了将vtables与对象关联起来,实现动态接口的另一种方式是将所需的函数指针表传递给需要它们的通用函数。...Lisp系列语言解决了这个问题,其语法和AST有非常直接的对应关系,但构造过程仍然很繁琐。因此,我提到的所有语言都有某种形式的 "引用 "原语,你在语言中提供一个代码片段,它就会返回语法树。...,以装箱方式实现的泛型所需要的类型系统和这个十分类似,这也是为什么Rust可以使用同一个类型系统来支持这两种泛型的原因!

    3.1K30

    实战:使用rust开发动态链接库并在Golang中使用

    了解Rust为什么比一些常用的语言(如Golang、Java等)更适合开发通用二进制库 了解一下Rust开发C-FFI库的方法,并介绍一些个人实际使用中遇到的问题(也可能是我太菜) 了解一下Golang...至于为什么ffi_demo.h文件中定义的uintptr_t变为cgo中的C.ulong,这个大家也没必要死记硬背,我们可以借助编译器的错误提示信息来获取到底是什么类型。...// 下面这一行再一次遍历底层的字节序列来检查一下这个字节序列是否满足UTF-8编码,如果检查通过,这个 // 函数返回一个&str类型的指针,同样指向原来的地址。...// 我们将要返回调用者一个指针,但返回的数据必须遵循C的字符串规范才能够穿越FFI的边界,也就是我们 // 要返回一个裸指针,裸指针本身没有字符串的长度信息,并且指向一块以Null结尾的内存区域...在C语言的调用规范中, 是不允许一个函数有多个返回值的,为了返回多个结果,我们有两种方式: 定义一个结构体来保存多个返回值的内容,然后返回指向这个结构体的指针 通过传入指针来修改调用者的内存数据,从而将要返回的值写入到调用者给定的变量中

    2.7K10

    从字符串来浅谈Rust内存模型

    虽然本质上来讲,之前的对象也会把指针放在栈上,但是从语言的角度来看那仅仅是个指针,并没有管理的逻辑。 C++的std::string就采用了这种实现方式。...Rust的字符串类似C++,但是它将移动升级为语言的一种核心机制,并配合其他机制共同保证内存安全。 所有权:转移的安全 在Rust中,参、返回甚至变量绑定等都默认进行移动操作。..., first, second); // 可以通过编译 背后的机制是Rust的unsafe,它允许我们创建C语言指针类似的裸指针,并在unsafe块内突破借用机制的限制。...堆的管理:智能指针 C/C++中都提供了特殊的方式来分配堆内存,如C语言的malloc函数和C++的new关键字,而它们的返回值都是对应类型的指针。...和字符串的例子一样,指针的使用意味着可能存在不安全的代码。而Rust的解决方案也和字符串一样:指针引入管理对象。在C++中这种管理对象也叫智能指针,由标准库提供。

    95910

    一次Rust重写基础软件的实践(三)

    有读者可能问:既然 Rust 定义了 Unrecoverable Errors, 那就是不可恢复的错误,我为什么还固执的需要处理这种错误呢?回答这个问题还是需要结合我的场景来讨论。...大家知道,在 C 语言中将一个数组作为参数传递给一个函数有如下三种方式 [3] : 将数组作为指针变量传递给函数 void foo(int* array) 将数组作为一个引用传递给函数 void foo...(int array[]) 将数组以一个指定 size 大小的数组传递给函数 void foo(int array[SIZE]) 在 C 语言中有多种方式把一个数组传递给函数,不仅如此,大家知道在...但是在混合状态下,比如 CRust 相互混合的项目中,在某些情况下由于类似的问题导致整个程序终止,这些行为也许并不是我们预期的。...其次,如果该闭包调用需要返回信息外部使用,那么可以将返回信息放入调用的返回值中,如上代码所示第一个闭包调用返回的 result_value 会被紧接的 match 代码所使用。

    17210

    RUST 语言特性之所有权

    新年开工,开启 work & study 模式,接着来学习 RUST 语言。 作为一名 C/C++ 程序员,C/C++ 语言中的指针是使用得最爽的,几乎无所不能,各种奇技淫巧也层出不穷。...但 C/C++ 语言中最折磨人的也是指针,伴随着开发过程的就是和指针导致的内存问题做斗争。 也许是意识到指针的巨大杀伤力,现代语言中都不再提供指针特性,改为引用和托管指针。...操作系统根据请求在堆中找到一块足够大的可用空间,将它标记为已使用,并把指向这片空间地址的指针返回程序。当程序不再需要这块内存时,通过某种方式来将这些内存归还给操作系统。...其实在 C++ 中,设计对象的深拷贝和浅拷贝同样存在考量。 所有权与函数 在 C++ 中,将指针问题复杂化的一个因素就是各种函数调用与返回RUST 语言同样如此。...这些不用特别去记忆,RUST 可以通过静态检查使我们免于犯错。 对于返回值,同样如此。 总结起来,变量所有权的转移总是遵循相同的模式: 将一个值赋值另一个变量时就会转移所有权。

    79560

    对 王垠《对 Rust 语言的分析》的分析

    引言 王垠在2016年写下这篇文章:《对 Rust 语言的分析》[1]。 当时觉得这篇文章对 Rust 语言的分析太偏颇,但是王垠说这篇文章一直更新。...而当你把这个变量赋值另外一个变量的时候,对于符合 Move 语义的类型,所有权是转移的。...这种思路不大对,它是从像 OCaml 那样的语言照搬过来的,而 OCaml 本身就有问题。 可是在 Rust 里面,不但动作(比如 y = 6 )返回一个值 (),你居然可以把这个值赋一个变量。...当 Rust 遇到 分号,继续往后面求值,如果分号后面什么都没有,则返回分号的值,就是单元类型。...现在你说可以通过一些特殊的构造,特殊的指针值方式,静态的决定内存的回收时间,真的有可能吗? 我认识 Rust 六年了,从来没有听说 Rust 能「静态决定内存回收时间」,出处是哪里呢?

    2.2K20

    透过 Rust 探索系统的本原:泛型

    当然,C++/Java 指向 vtable 的指针在编译时放在类结构里,而 Rust 放在 Trait object 中。...这也是为什么 Rust 很容易对基本类型(primitive type)做动态分派,而 C++/Java 不行。事实上,Rust 也并不区分基本类型,对 Rust 来说,所有的类型的地位都是一致的。...下图左边的代码是大家都很熟悉的,估计闭着眼睛也能写出来的 C 语言版本的 binary_search 算法。...右边是 Alexander Stepanov 为 C++ STL 初版设计的类似算法(之所以叫 lower_bound,是因为它不仅使用 binary search 返回匹配的结果,在没找到时,还会返回其应该所处的位置...这也意味着,即便 Rust 在很多场合能够取代 C,但 Rust 可能永远也无法取代 C 在操作系统应用程序二进制接口 (ABI)中的地位。

    1.1K40

    深度分析:前端中的后端-实现篇

    Swift 代码提供一个用于初始化的 protobuf 字节流的指针和长度,Rust 侧创建对应的运行时,然后返回 Swift 一个句柄,供以后的请求使用。这个请求一般是 app 启动时调用。...因为我们两个语言之间交互的主要接口就几个,而涉及的指针,只有以下两种,所以我们只需要相应地处理: ByteBuffer *:Rust 返回 Swift 的 protobuf 字节流,Swift 做 defer...我们知道,当函数正常调用结束后,其调用栈返回到调用之前的状态 —— 你可以写一段简单的 C 代码,编译成 .o,然后用 objdump 来查看编译器自动插入的栈展开代码。...在这个过程中,涉及到的上下文中所有的栈对象和用智能指针管理的堆对象都会并回收,不会有内存泄漏(对于 C++ 来说,非智能指针分配出的对象泄漏)。...Rust 提供给其它语言C FFI,需要妥善测试。

    1.9K10
    领券