黒田です。

rubyスクリプト側で、

func_foo{|buff|
  buff = "bar"
}

とargを書きかえても、これを呼んだ

rb_funcall(func_foo, id_call, 1, buff);

以降で、buffを参照しても "bar"にはなっていません。
今のところ、

C側を、in用(arg[0])とout用(arg[1])の別の変数にして、配列で渡すような

  arg = rb_ary_new2(2);
  rb_ary_store(arg, 0, rb_str_new2(buff));
  
  rb_funcall(func, id_call, 1, arg);
  strcpy(buff, STR2CSTR(rb_ary_entry(arg, 1)));

として、

func_foo{|arg|
  arg[1] = "bar"
}

で、なんとかなってます。
もっとうまい方法は、ありますか?
- --
黒田 淳 (くろだ じゅん)