>>242,246
まさにその通りでした。変数の初期化がされてなく、-O0のときだけたまたま動いていただけでした。
ヒントありがとうございました。
今回はGCは絡んでなかったのでよかったのですが、そうなったらもうお手上げですね。

もうひとつ質問ですが、rb_ivar_set()では
VALUE obj = ...;
rb_ivar_set(obj, rb_intern("foo"), INT2FIX(123));
だとうまく行かずに
rb_ivar_set(obj, rb_intern("@foo"), INT2FIX(123));
だとうまくいったんですが、"@"は必ずつけないといけないのでしょうか。
Rubyのソースコードをみると、"@"はつけてないように見えます。
今書いてるコードでは、Rubyとは別のライブラリの中に
char *names[16];
というのがあって、これを使って
for (i = 0; i < 16; i++) {
 rb_ivar_set(obj, rb_intern(names[i]), val);
}
としたいんですが、"@"をつけなきゃいけないとなるとちょっと面倒だなーと思ってるんですが、こんなときみなさんどうしてますか。