2016-06-24 13 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-연결-KIT (documentation)를 사용하려고 나누기

(complete code)

나는 그것이 작동하는 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_ptrthis RFC 제안을 참조하십시오.

설명서 개선을위한 제안 사항은 언제든지 환영합니다.

+0

지금은 의미가 있습니다. 문서의 경고는 좋습니다. RFC 제안서에서 나와 같은 많은 초보자들이이 문제로 어려움을 겪고있는 것으로 보입니다. 원시 포인터가 "* _ptr"로 끝나지 않을 경우 사용자에게 원시 포인터에 대한 명명 규칙을 사용하도록 "권장"하는 것이 맞습니까? 어쩌면 장기적으로 올바른 메모리 관리와 관련된 주의력이 증가 할 것이며, 사람들이 잘못된 것이 있으면 컴파일러에 의존하지 말아야 할 것입니다. 보다 많은 선진 사람들이 경고를 해제 할 수 있습니다. – poidl