首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >.unwrap().as_ptr()给出了空的*const c_char

.unwrap().as_ptr()给出了空的*const c_char
EN

Stack Overflow用户
提问于 2018-09-05 06:51:01
回答 1查看 1.2K关注 0票数 3

我有一个期望*const std::os::raw::c_char的C函数,并且我已经在Rust中完成了以下操作:

use std::os::raw::c_char;
use std::ffi::{CString, CStr};
extern crate libc;

fn main() {
    let _test_str: *const c_char = CString::new("Hello World").unwrap().as_ptr();
    let fmt: *const c_char = CString::new("%s\n").unwrap().as_ptr();
    unsafe { libc::printf(fmt, _test_str); }

    unsafe {
        let slice = CStr::from_ptr(_test_str);
        println!("string buffer size without nul terminator: {}", slice.to_bytes().len());
    }
}

但是,我无法将_test_str打印出来,并且上面程序的输出只是

string buffer size without nul terminator: 0

如果我将_test_str传入某个C函数,发现它是一个空字符串。我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-05 07:14:59

在与创建指向它的指针相同的语句中创建CStringCString是拥有的,但没有绑定到变量,因此它只与封闭语句一样长,从而导致指针变得无效。这是由documentation for as_ptr特别警告的

例如,当在不安全块内使用ptr时,以下代码将导致未定义的行为:

使用std::ffi::{CString};让ptr = CString::new("Hello").expect("CString::new failed").as_ptr();不安全{ // ptr挂起*ptr;}

这是因为as_ptr返回的指针不携带任何生存期信息,并且CStringCString::new("Hello").expect("CString::new failed").as_ptr()表达式求值后立即释放。

您可以通过引入将在整个函数中存在的变量,然后创建指向这些变量的指针来解决此问题:

fn main() {
    let owned_test = CString::new("Hello World").unwrap();
    let _test_str: *const c_char = owned_test.as_ptr();
    let owned_fmt = CString::new("%s\n").unwrap();
    let fmt: *const c_char = owned_fmt.as_ptr();

    unsafe {
        libc::printf(fmt, _test_str);
    }

    unsafe {
        let slice = CStr::from_ptr(_test_str);
        println!(
            "string buffer size without nul terminator: {}",
            slice.to_bytes().len()
        );
    }

    // owned_fmt is dropped here, making fmt invalid
    // owned_test is dropped here, making _test_str invalid
}

如果您正在使用原始指针,则需要格外小心,以确保它们始终指向实时数据。引入变量是精确控制数据生存期的最佳方法-从变量的初始化到变量超出作用域的那一刻。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52174925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档