The Regents of the University of California. All rights reserved.
%sccs.include.proprietary.roff%
@(#)malloc.3 8.1 (Berkeley) 06/05/93
subroutine malloc (size, addr) integer size, addrsubroutine free (addr) integer addr
subroutine falloc (nelem, elsize, clean, basevec, addr, offset) integer nelem, elsize, clean, addr, offset
Falloc allocates space for an array of nelem elements of size elsize and returns the address of the block in addr. It zeros the block if clean is 1. It returns in offset an index such that the storage may be addressed as basevec(offset+1) ... basevec(offset+nelem). Falloc gets extra bytes so that after address arithmetic, all the objects so addressed are within the block.
The argument to free is the address of a block previously allocated by malloc or falloc ; this space is made available for further allocation, but its contents are left undisturbed. To free blocks allocated by falloc, use addr in calls to free, do not use basevec(offset+1).
Needless to say, grave disorder will result if the space assigned by malloc or falloc is overrun or if some random number is handed to free .
The following example shows how to obtain memory and use it within a subprogram:
integer addr, work(1), offset ... call falloc ( n, 4, 0, work, addr, offset ) do 10 i = 1, n work(offset+i) = ... 10 continue
The next example reads in dimension information, allocates space for two arrays and two vectors, and calls subroutine doit to do the computations:
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) ...