なかだです。

arton wrote in [ruby-list:45497]:
At Fri, 12 Sep 2008 01:37:54 +0900,
> したがって、rubikitchさんが書かれた方法を兼用して、
> volatile VALUE* pary = rb_ary_new...

  VALUE ary = rb_ary_new(n);
  VALUE *pary = RARRAY_PTR(ary);
  /* ... */
  RB_GC_GUARD(ary);
です。

あるいは
  VALUE *pary = ALLOCA_N(VALUE, n);

> のようにすれば、スタック上(GCによって有効と判断される)のVALUE*に配列が
> 確保できるので安全です。ここで、volatileを付けないと最適化によっては、そ
> のコードの位置でスタックに積まれないのでGCされてしまう可能性があるのは、
> ご想像の通りです。

VALUE*がスタックやレジスタにあってもGCに対しては無意味です。また、
volatileがあっても末尾呼び出しの最適化などで消される可能性があります。

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦