擅长:python、mysql、java
<p>这里的问题是您直接返回一个<code>CString</code>,它与<code>C</code>中的字符串表示不对应(您可以看到<a href="http://static.rust-lang.org/doc/master/src/std/ffi/c_str.rs.html#66-68" rel="nofollow">here</a>的源代码<code>CString</code>)。在</p>
<p>应该使用<code>s.as_ptr()</code>返回指向字符串的指针。但是,您需要确保在函数末尾没有释放字符串,因为这将导致指针悬空。在</p>
<p>我能想到的唯一解决方案是使用<code>forget</code>让rust忘记变量,而不是释放它。当然,您需要在以后找到释放字符串的方法,以避免内存泄漏(参见Vladimir的答案)。在</p>
<p>根据我提到的更改,您的Rust代码应该是以下内容:</p>
<pre><code>use std::ffi::CString;
use std::mem;
#[no_mangle]
pub extern fn query() -> *const i8 {
let s = CString::new("Hello!").unwrap();
let ptr = s.as_ptr();
mem::forget(s);
return ptr;
}
</code></pre>