MALLOC(3F7768) — NEWS-OS Programmer’s Manual
名称
malloc, free, falloc − メモリの割り当て
形式
subroutine malloc (size, addr)
integer size, addr
subroutine free (addr)
integer addr
subroutine falloc (nelem, elsize, clean, basevec, addr, offset)
integer nelem, elsize, clean, addr, offset
解説
malloc、 falloc および free は、 汎用メモリの割り当てパッケージを提供します。 malloc は、 偶数バイト目から始まる、 size バイト以上のブロックのアドレスを addr に返します。
falloc は、 サイズ elsize の要素 nelem 個からなる配列に空間を割り当て、 addr にそのブロックのアドレスを返します。 clean が 1 の場合、 このブロックはゼロになります。 そして、記憶域を bsaevec(offset+1)...basevec(offset+elem) のようにアドレス付けできるように、 インデックスを offset に返します。 falloc は、 引数から計算されるよりもメモリを多く取ります。 それは、 アドレス計算されたオブジェクトが全てブロック内に納まるように 考えられているからです。
free の引数は、 あらかじめ malloc または falloc で割り当てられたブロックのアドレスです。 この空間は、 別の割り当てに利用できるようになりますが、 その内容はそのまま残されます。 falloc で割り当てられたブロックを解放する場合、 free を呼び出す時には addr を 使い、 basevec(offset+1) を使ってはいけません。 すでに、 malloc または falloc で割り当てられた空間が過大な場合、 あるいは、 free にいい加減な値を渡した場合は、異常終了します。
診断
利用できるメモリがない場合、 あるいはブロックの境界外にデータを 格納して該当領域が信頼できなくなった場合、 malloc と falloc は addr に 0 をセットします。 次の例に、メモリを獲得し、 それをサブプログラムで使う方法を示します。
integer addr, work(1), offset
...
call falloc ( n, 4, 0, work, addr, offset )
do 10 i = 1, n
work(offset+i) = ...
10 continue
次の例では、 ディメンション情報を入力し、 2 個の配列と 2 個のベクトルに空間を割り当て、 サブルーチン doit を呼び出し計算します。
integer addr, dummy(1), offs
read ∗, k, l, m
indm1 = 1
indm2 = indm1 + k∗l
indm3 = indm2 + l∗m
indsym = indm3 + k∗m
lsym = n∗(n+1)/2
indv = indsym + lsym
indtot = indv + m
call falloc ( indtot, 4, 0, dummy, addr, offs )
call doit( dummy(indm1+offs), dummy(indm2+offs),
. dummy(indm3+offs), dummy(indsym+offs),
. dummy(indv +offs), m, n, lsym )
end
subroutine doit( arr1, arr2, arr3, vsym, vec, m, n, lsym )
real arr1(k,l), arr2(l,m), arr3(k,m), vsym(lsym), v2(m)
...
関連ファイル
/usr/lib/libU7768.a
関連事項
NEWS-OSRelease 4.2.1R