回答編集履歴
1
未執筆部の加筆
    
        answer	
    CHANGED
    
    | @@ -1,23 +1,24 @@ | |
| 1 | 
            -
            質問に対する回答になっていなかったので補足します。 | 
| 1 | 
            +
            質問に対する回答になっていなかったので補足します。
         | 
| 2 2 |  | 
| 3 | 
            +
            質問の意味は「Rust 側で定義した文字列を `*mut c_char` として C/Go 側に返す方法」と解釈しました。これは `CString::as_ptr()` を使用します。
         | 
| 3 4 |  | 
| 4 | 
            -
             | 
| 5 5 | 
             
            ```rust
         | 
| 6 6 | 
             
            let x = CString::new("world").unwrap();
         | 
| 7 7 | 
             
            echo_rust_string(x.as_ptr());
         | 
| 8 8 | 
             
            ```
         | 
| 9 9 |  | 
| 10 | 
            -
            `x` 自身の生存範囲はプログラマ自身が
         | 
| 10 | 
            +
            当然ですが、 `x` 自身の生存範囲はプログラマ自身が責任を持って管理する必要があります。例えば、次のような例は無効です。
         | 
| 11 11 |  | 
| 12 12 | 
             
            ```rust
         | 
| 13 13 | 
             
            let x_ptr = CString::new("world").unwrap().as_ptr();
         | 
| 14 | 
            -
            echo_rust_string(x_ptr);
         | 
| 14 | 
            +
            echo_rust_string(x_ptr); // 呼び出す前に一時オブジェクトが破棄されるためポインタの指す値は無効
         | 
| 15 15 | 
             
            ```
         | 
| 16 16 |  | 
| 17 17 | 
             
            ```rust
         | 
| 18 18 | 
             
            #[no_mangle]
         | 
| 19 19 | 
             
            pub extern "C" fn hoge() -> *const c_char {
         | 
| 20 20 | 
             
                let s = CString::new("hoge").unwrap();
         | 
| 21 | 
            +
                s.as_ptr()
         | 
| 21 | 
            -
                 | 
| 22 | 
            +
                // スコープを抜けるときに s が解放されるためポインタは無効
         | 
| 22 23 | 
             
            }
         | 
| 23 24 | 
             
            ```
         | 
