Museum

Home

Lab Overview

Retrotechnology Articles

⇒ Online Manual

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

malloc(3)

MALLOC(3F)

+U77 FORTRAN compile-line option required

NAME

malloc, free, falloc − memory allocator

SYNOPSIS

subroutine malloc (size, addr)
INTEGER*4 size, addr

subroutine free (addr)
INTEGER*4 addr

subroutine falloc (nelem, elsize, clean, basevec, addr, offset)
INTEGER*4 nelem, elsize, clean, addr, offset

DESCRIPTION

Malloc, falloc and free provide a general-purpose memory allocation package.  Malloc returns in addr the address of a block of at least size bytes suitably aligned for storage of any type of object. 

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).  Basevec is an input argument to falloc and should be declared as an array.  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.

DIAGNOSTICS

Malloc and falloc set addr to 0 if there is no available memory or if the arena has been detectably corrupted by storing outside the bounds of a block. 

The following example shows how to obtain memory and use it within a subprogram:

       INTEGER*4 n, addr, work(1), offset
         ...
      call falloc ( n, 4J, 0J, 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*4 indtot, 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, 4J, 0J, 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)
         ...

FILES

/usr/lib/libU77.a

SEE ALSO

malloc(3)

Hewlett-Packard Company  —  HP-UX Release 9.0: June 1992

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026