4

尝试使用 Rust(文档)中的 JACK-AUDIO-CONNECTION-KIT,我遇到了调用问题

jack_client_t* jack_client_open (   const char *    client_name,
                                    jack_options_t  options,
                                    jack_status_t *     status,
                                    ... )   

在 Rust 中我使用

#[link(name = "jack")]
extern "C" {
    pub fn jack_client_open(name: *const libc::c_char,
                        options: JackOptions,
                        status: &JackStatus)
                        -> *mut JackClientT;
}

完整代码

当我使用name带有四个字符的 a 时,它可以工作,例如

let name = CString::new("yass").unwrap().as_ptr();

但如果我使用 5 个或更多字符,它就不起作用。在上面链接的 JACK 文档中,它说名称最多可以是int jack_client_name_size()字符长,在我的例子中是 64。为什么会这样?

4

1 回答 1

6

let name = CString::new("yass").unwrap().as_ptr();分配一个字符串,获取一个指向它的指针......然后扔掉这个字符串,所以你得到了一个use-after-free。不要这样做。写let name = CString::new("yass").unwrap();,然后使用name.as_ptr()CStr::as_ptr另请参阅RFC 提案。

欢迎任何改进文档的建议。

于 2016-06-24T08:44:37.120 回答