teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

未執筆部の加筆

2017/07/25 17:26

投稿

ubnt-intrepid
ubnt-intrepid

スコア58

answer CHANGED
@@ -1,23 +1,24 @@
1
- 質問に対する回答になっていなかったので補足します。質問の意味は「Rust 側で定義した文字列を `*mut c_char` として C/Go 側に返す方法」と解釈します。
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
- s.as_ptr() // スコープを抜けるときに s が解放されるためポインタは無効
22
+ // スコープを抜けるときに s が解放されるためポインタは無効
22
23
  }
23
24
  ```