Next: , Previous: foreign-free, Up: Pointers


foreign-alloc

Syntax

— Function: foreign-alloc type &key initial-element initial-contents (count 1) null-terminated-p ⇒ pointer

Arguments and Values

type
A foreign type.
initial-element
A Lisp object.
initial-contents
A sequence.
count
An integer. Defaults to 1 or the length of initial-contents if supplied.
null-terminated-p
A boolean, false by default.
pointer
A foreign pointer to the newly allocated memory.

Description

The foreign-alloc function allocates enough memory to hold count objects of type type and returns a pointer. This memory must be explicitly freed using foreign-free once it is no longer needed.

If initial-element is supplied, it is used to initialize the count objects the newly allocated memory holds.

If an initial-contents sequence is supplied, it must have a length less than or equal to count and each of its elements will be used to initialize the contents of the newly allocated memory.

If count is omitted and initial-contents is specified, it will default to (length initial-contents).

initial-element and initial-contents are mutually exclusive.

When null-terminated-p is true, (1+ (max count (length initial-contents))) elements are allocated and the last one is set to NULL. Note that in this case type must be a pointer type (ie. a type that canonicalizes to :pointer), otherwise an error is signaled.

Examples

  CFFI> (foreign-alloc :char)
  => #<A Mac Pointer #x102D80>     ; A pointer to 1 byte of memory.
   
  CFFI> (foreign-alloc :char :count 20)
  => #<A Mac Pointer #x1024A0>     ; A pointer to 20 bytes of memory.
   
  CFFI> (foreign-alloc :int :initial-element 12)
  => #<A Mac Pointer #x1028B0>
  CFFI> (mem-ref * :int)
  => 12
   
  CFFI> (foreign-alloc :int :initial-contents '(1 2 3))
  => #<A Mac Pointer #x102950>
  CFFI> (loop for i from 0 below 3
              collect (mem-aref * :int i))
  => (1 2 3)
   
  CFFI> (foreign-alloc :int :initial-contents #(1 2 3))
  => #<A Mac Pointer #x102960>
  CFFI> (loop for i from 0 below 3
              collect (mem-aref * :int i))
  => (1 2 3)
   
  ;;; Allocate a char** pointer that points to newly allocated memory
  ;;; by the :string type translator for the string "foo".
  CFFI> (foreign-alloc :string :initial-element "foo")
  => #<A Mac Pointer #x102C40>
  ;;; Allocate a null-terminated array of strings.
  ;;; (Note: FOREIGN-STRING-TO-LISP returns NIL when passed a null pointer)
  CFFI> (foreign-alloc :string
                       :initial-contents '("foo" "bar" "baz")
                       :null-terminated-p t)
  => #<A Mac Pointer #x102D20>
  CFFI> (loop for i from 0 below 4
              collect (mem-aref * :string i))
  => ("foo" "bar" "baz" NIL)
  CFFI> (progn
          (dotimes (i 3)
            (foreign-free (mem-aref ** :pointer i)))
          (foreign-free **))
  => nil

See Also

foreign-free
with-foreign-object
with-foreign-pointer