gpt4 book ai didi

rust - C 字符串中缺少第一个字符

转载 作者:行者123 更新时间:2023-11-29 08:27:36 25 4
gpt4 key购买 nike

我正在编写与 girara 库的绑定(bind),但状态栏项目文本存在问题:缺少第一个字符。

这是我绑定(bind)的一部分:

#[link(name="girara-gtk3")]
extern "C" {
// Statusbar.
pub fn girara_statusbar_item_add(session: *mut girara_session_t,
expand: bool,
fill: bool,
left: bool,
callback: girara_statusbar_event_t)
-> *mut girara_statusbar_item_t;
pub fn girara_statusbar_item_set_text(session: *mut girara_session_t,
item: *mut girara_statusbar_item_t,
text: *const c_char);
}

下面是我如何调用这些函数:

let item = unsafe { girara_statusbar_item_add(session, true, true, true, None) };
assert!(item != 0 as *mut _);

let text = CString::new("girara-left").unwrap().as_ptr();
unsafe { girara_statusbar_item_set_text(session, item, text) };

但是我没有显示 girara-left,而是只看到 irara-left

使用 CString 是将 *const c_char 发送到 FFI 的好方法吗?

为什么第一个字符不见了?

更新

这里发生了一些奇怪的事情。

如果我将代码更改为:

let text = CString::new("girara-left").unwrap().as_ptr();
let text2 = CString::new("hello World").unwrap();
unsafe { girara_statusbar_item_set_text(session, item, text) };

(未使用 text2),显示文本 hello World,这没有意义。指针似乎没有指向正确的位置。

最佳答案

这个问题是因为 CString 在指针被发送到 ffi 函数之前被删除了(参见 here )。

解决方案是将 CString 绑定(bind)到一个变量:

let text = CString::new("girara-left").unwrap();
unsafe { girara_statusbar_item_set_text(session, item, text.as_ptr()) };

关于rust - C 字符串中缺少第一个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37231352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com