为什么转换&;将str转换为*const i8,将其发送到C或从C发送,然后转换回a&;str是否导致UTF8错误?

为什么转换&;将str转换为*const i8,将其发送到C或从C发送,然后转换回a&;str是否导致UTF8错误?,c,rust,ffi,C,Rust,Ffi,我想从Rust调用以下C函数: char const*strmin_c(char const*str1,char const*str2) {返回strcmp(str1,str2)*常量cu char; } pub不安全fn标准钢筋锈蚀(str1:&'static str,str2:&'static str)->&'static str{ 设_str1:*常数c::c_char=str1.as_ptr()as*常数i8; 设_str2:*常数c::c_char=str2.as_ptr()as*常数

我想从Rust调用以下C函数:

char const*strmin_c(char const*str1,char const*str2)
{返回strcmp(str1,str2)*常量cu char;
}
pub不安全fn标准钢筋锈蚀(str1:&'static str,str2:&'static str)->&'static str{
设_str1:*常数c::c_char=str1.as_ptr()as*常数i8;
设_str2:*常数c::c_char=str2.as_ptr()as*常数i8;
std::ffi::CStr::from_ptr(strmin_c(_str1,_str2))
.to_str()
.unwrap()
}
尝试使用以下命令调用此命令时:

assert!(strmin_rust(abdd,abcd)),;
这引起了恐慌:

线程'main'在'Err'值上调用'Result::unwrap()'时惊慌失措{Utf8Error{valid\u up\u to:321,error\u len:Some(1)}

这里有什么问题?这是所有权问题还是生命周期问题?使用
CStr::from_ptr
是正确的方法吗?

TL;灾难恢复:使用
CString
。防锈串未进行NUL端接。试图用CStr
CStr
解析它们是不合适的,也不能用C
strcmp
之类的函数对它们进行操作。你甚至可以不用任何外国金融机构。