From: Takaaki Tateishi Date: 2003-01-09T18:09:54+09:00 Subject: [ruby-dev:19334] Re: [Ruby/DL] 'S', 's' 立石です. At Thu, 9 Jan 2003 16:13:17 +0900, > となってますが、ext/dl/sym.cのrb_dlsym_call()を見ると逆です。 > case 'S': > return "const char *"; > case 's': > return "char *"; > という記述もあるので、どうも実装のほうが間違ってるようです。 一瞬自分でも間違えてるかもと思ってしまいましたが,実は const char * と いう記述が正確ではないです.const char * とあるのはあくまで書き込みを 行わないという宣言程度の意味です. 以下の結果となりますが,すべて意図した通りのものです. 'S' の方はRuby で確保されている実際の文字列の領域へ書き込みが行われそのままそのオブジ ェクトを返します.'s'の方はdl内部でメモリを確保して新しいStringオブジェ クトを返しています. irb(main):009:0> sym = h['strcpy','SsS'] => # irb(main):010:0> sym.call(" ","ab") => ["ab", ["ab", "ab"]] ↑ " " と "ab" は異なるオブジェクトです. irb(main):011:0> sym = h['strcpy','SSS'] => # irb(main):012:0> sym.call(" ","ab") => ["ab", ["ab\000", "ab"]] ↑ これはもともとの " " が長さが3だったためです. 2つのオブジェクトは同じオブジェクトです. -- Takaaki Tateishi