2016-05-14 9 views
0

Ich schreibe eine Bindung an die girara-Bibliothek, und ich habe ein Problem mit dem Text in der Statusleiste: Das erste Zeichen fehlt.Fehlendes erstes Zeichen von C-String

Hier ist ein Teil meiner Bindung:

#[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); 
} 

und hier ist, wie ich diese Funktionen aufrufen:

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) }; 

Aber statt girara-left zu zeigen, wie ich sehe irara-left nur.

Verwenden Sie CString eine gute Möglichkeit, *const c_char zu einem FFI zu senden?

Warum fehlt das erste Zeichen?

aktualisieren

Es gibt hier etwas seltsam hapening.

Wenn ich den Code ändern zu:

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) }; 

(wo text2 nicht verwendet wird), wird der Text hello World gezeigt, die keinen Sinn macht. Es scheint, dass der Zeiger nicht an der richtigen Stelle zeigt.

Antwort

2

Dieses Problem kam durch die Tatsache, dass die CString gelöscht wurde, bevor der Zeiger an die FFI-Funktion gesendet wurde (siehe here).

Die Lösung ist die CString auf eine Variable zu binden:

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

Und stellen Sie sicher, dass Ihre '' girara_statusbar_item_set_text Funktion hält keinen Verweis auf diese Zeichenfolge darüber hinaus, wie lange das 'CString' lebt ... ! – Shepmaster

+2

Beachten Sie, dass Clippy [ein Flusen dafür] hat (https://github.com/Manishearth/rust-clippy/wiki#temporary_cstring_as_ptr) (Disclaimer: Ich bin ein Clippy Mitwirkender). – mcarton