2016-06-24 32 views
4

Der Versuch, die JACK-AUDIO-CONNECTION-KIT von Rust (documentation) zu verwenden, ich laufe in ProblemeJack Audio-Client-Name länger als 4 Zeichen bricht Client

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

In Rust Aufruf Ich benutze

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

(complete code)

Wenn ich ein name mit vier Zeichen verwenden es funktioniert, zB

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

aber wenn ich 5 oder mehr Zeichen verwende, funktioniert es nicht. In den JACK-Dokumenten, die mit oben verknüpft sind, heißt es, dass der Name maximal int jack_client_name_size() Zeichen lang sein kann, was in meinem Fall 64 ist. Warum passiert das?

Antwort

6

let name = CString::new("yass").unwrap().as_ptr(); weist eine Zeichenkette zu, erhält einen Zeiger darauf ... und verwirft dann die Zeichenkette, so dass Sie eine Verwendung nach der Freigabe erhalten. Tu das nicht. Schreiben Sie let name = CString::new("yass").unwrap();, dann verwenden Sie name.as_ptr(). Siehe auch CStr::as_ptr und this RFC-Vorschlag.

Vorschläge zur Verbesserung der Dokumentation wären willkommen.

+0

Macht jetzt Sinn, danke! Die Warnung in den Dokumenten ist gut. Aus dem RFC-Vorschlag scheint es, dass viele Anfänger (wie ich) damit zu kämpfen haben. Wäre es sinnvoll, Benutzer zu "ermutigen", eine Benennungskonvention für unformatierte Zeiger zu verwenden, d. H. Eine Warnung auszugeben, wenn unformatierte Zeiger nicht in "* _ptr" enden. Vielleicht würde dies auf lange Sicht die Wachsamkeit in Bezug auf die korrekte Speicherverwaltung erhöhen und würde Leute dazu bringen, sich nicht auf den Compiler zu verlassen, wenn etwas nicht stimmt. Mehr Vorreiter könnten die Warnung deaktivieren. – poidl