いしもと といいます。

 かなり長い(数百万単位)要素数の数値配列といくつかの
係数を受け取り、それを計算して二次元配列を返す拡張ライ
ブラリを作っています。
 拡張ライブラリ内で配列の領域を確保する際、ALLOCA_N
で確保した場合は(スタック領域の範囲内であれば)問題なく
動作しているようなのですが、同じ領域をALLOC_Nで(ヒー
プ領域に?)確保するとかなり短い配列(私の環境では要素数
6266)しか扱えず、それを超えるとsegmentation faultが発
生してしまいます。私は一体何を間違ってしまっているのでし
ょうか?
 rubyは2年ほど使っていますが、c言語を扱うのは初めてで、
ruby本やc言語関連のwebを参考にしながら見よう見まねで書
いているレベルです。アドバイス頂ければ幸いです。
使用環境:
MacOSX 10.4(PowerPC)
メモリ 1GB
Ruby 1.8.6

SI.c --------------------------------------------------
#include "ruby.h"

static VALUE
si_calc6( self, ary1d, x0, y0, a )
	VALUE self ;
	VALUE ary1d ;
	VALUE x0 ;
	VALUE y0 ;
	VALUE a ;
{
	unsigned int i ;
	unsigned int len = 2 ;
       /* 引数をc言語の型に変換 */
	int x0c = NUM2INT( x0 ) ;
	int y0c = NUM2INT( y0 ) ;
	double ac = NUM2DBL( a ) ;
	long length = RARRAY( ary1d )->len ;
	VALUE *items = ALLOC_N( VALUE, length ) ; /* <- これ */
	/* VALUE *items = ( VALUE *)malloc( length * sizeof( VALUE ) ) ;*/

	VALUE item ;
	VALUE t ;
	VALUE xt ;
	double y ;

	for ( i = 0 ; i < length ; i++){
		t = INT2FIX( i + x0c );
		y = NUM2DBL( rb_ary_entry( ary1d, i ) ) ;
		xt = rb_float_new( y0c - ( y * ac ) ) ;
		item = rb_ary_new3( len, t, xt ) ;
		items[i] = item ;
	}
	
	VALUE result = rb_ary_new4( length, items ) ;
	free( items ) ;
	return result ;
}

void Init_SI(){
	VALUE msi = rb_define_module( "SI" ) ;
	rb_define_module_function( msi, "calc6", si_calc6, 4) ;
}

test.rb -----------------------------------------------
require 'SI'
include SI

ary=[]
6267.times{ ary.push 14238.45331 }

x0=40
y0=100
a=0.01213

ext=calc6(ary,x0,y0,a)  # => segmentation fault
                               # (ary.length<=6266ならOK)
___________________
いしもと まさと(石本 将人)