新井です。

rb_ary_s_create の ALLOC_N()で、rb_gc()が呼ばれると

    385 void
    386 rb_gc_mark(ptr)
    387     void *ptr;
    388 {

    551       case T_ARRAY:
    552         {
    553             int i, len = obj->as.array.len;
    554             VALUE *ptr = obj->as.array.ptr;
    555 
    556             for (i=0; i < len; i++)
    557                 rb_gc_mark(*ptr++);
    558         }
    559         break;

rb_gc_mark()の557行目で落ちることがあります。

落ちるときのmarkの対象はrb_ary_s_create()で生成し
たばかりのオブジェクトなのですが、まだptrが割り当
てられてなくlen=1、ptr==NULLとなっているためのよう
です。

以下のような修正でとりあえず回避できたのですが、本
当はどのように修正するのが良いのでしょう?

--- gc.c	1999/03/24 08:52:28	1.1.1.3.2.5
+++ gc.c	1999/04/30 09:03:32
@@ -553,6 +553,7 @@ rb_gc_mark(ptr)
 	    int i, len = obj->as.array.len;
 	    VALUE *ptr = obj->as.array.ptr;
 
+	    if (ptr == NULL) break;
 	    for (i=0; i < len; i++)
 		rb_gc_mark(*ptr++);
 	}

ptr == NULL が保証されていなければ、以下の方が良さ
そうですが…(GCはよくわからない…)

--- array.c	1999/03/24 08:52:23	1.1.1.3.2.7
+++ array.c	1999/04/30 08:51:56
@@ -208,8 +208,8 @@ rb_ary_s_create(argc, argv, klass)
     NEWOBJ(ary, struct RArray);
     OBJSETUP(ary, klass, T_ARRAY);
 
-    ary->len = argc;
-    ary->capa = argc;
+    ary->len = 0;
+    ary->capa = 0;
     if (argc == 0) {
 	ary->ptr = 0;
     }
@@ -217,6 +217,8 @@ rb_ary_s_create(argc, argv, klass)
 	ary->ptr = ALLOC_N(VALUE, argc);
 	MEMCPY(ary->ptr, argv, VALUE, argc);
     }
+    ary->len = argc;
+    ary->capa = argc;
 
     return (VALUE)ary;
 }