2016-06-24 9 views
4

が、私はジャックオーディオクライアント名は、クライアント

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

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

を呼び出す問題に実行を錆からJACK-AUDIO-CONNECTION-KIT(documentation)を使用しようとすると壊れます

complete code

私は、それが動作する4つの文字で例えばnameを使用

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

ただし、5文字以上を使用すると動作しません。上にリンクされたJACKドキュメントでは、その名前は最大でint jack_client_name_size()文字であり、私の場合は64文字であると言われています。なぜこれが起こるのですか?

答えて

6

let name = CString::new("yass").unwrap().as_ptr();は、文字列を割り当て、その文字列を指すポインタを取得してから、文字列をスローします。これをしないでください。 let name = CString::new("yass").unwrap();と入力し、name.as_ptr()と入力します。 CStr::as_ptrおよびthis RFC提案も参照してください。

ドキュメントを改善するためのご意見は歓迎します。

+0

感謝しています。ありがとう!ドキュメントの警告は良いです。 RFCの提案から、多くの初心者(私のような)がこれと闘っているようです。生ポインタが "* _ptr"で終わっていない場合に警告を出すことは、ユーザに生ポインタの命名規則を使用させることを "促す"ことは意味がありますか?たぶん長期的には正しいメモリ管理に関する警戒感が増し、何かが間違っているとコンパイラがエラーに陥らないように促すでしょう。より多くの先進的な人々が警告を無効にすることができます – poidl

関連する問題