COHERENT manpages

This page displays the COHERENT manpage for malloc() [Allocate dynamic memory].

List of available manpages
Index


malloc() -- General Function (libc)

Allocate dynamic memory
#include <stdlib.h>
char *malloc(size) unsigned size;

malloc()  helps  to  manage  a  program's  free-space arenas.   It  uses  a
circular, first-fit  algorithm to select  an unused block of  at least size
bytes,  marks the  portion  it uses,  and  returns a  pointer  to it.   The
function free() returns allocated memory to the free memory pool.

Each arena allocated  by malloc() is rounded up to  the nearest even number
and preceded  by an unsigned int  that contains the true  length.  Thus, if
you ask  for three bytes you  get four, and the  unsigned that precedes the
newly allocated arena is set to four.

When  an arena  is freed,  its low  order bit  is turned  on; consolidation
occurs when  malloc() passes over an  arena as it searches  for space.  The
end of  each arena contains  a block with  a length of zero,  followed by a
pointer to the next arena.  Arenas point in a circle.

The most  common problem with malloc() occurs when  a program modifies more
space than  it allocates with  malloc(). This can cause  later malloc()s to
crash with a message that indicates that the arena has been corrupted.  You
can use the function memok() to isolate these problems.

Example

This example  reads from  the standard  input up to  NITEMS items,  each of
which is up to MAXLEN long, sorts them, and writes the sorted list onto the
standard output.  It  demonstrates the functions qsort(), malloc(), free(),
exit(), and strcmp().

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define NITEMS 512
#define MAXLEN 256
char *data[NITEMS];
char string[MAXLEN];

main()
{
    register char **cpp;
    register int count;
    extern int compare();

    for (cpp = &data[0]; cpp < &data[NITEMS]; cpp++) {
        if (gets(string) == NULL)
            break;
        if ((*cpp = malloc(strlen(string) + 1)) == NULL)
            exit(1);
        strcpy(*cpp, string);
    }

    count = cpp - &data[0];
    qsort(data, count, sizeof(char *), compare);

    for (cpp = &data[0]; cpp < &data[count]; cpp++) {
        printf("%s\n", *cpp);
        free(*cpp);
    }
    exit(0);
}

compare(p1, p2)
register char **p1, **p2;
{
    extern int strcmp();
    return(strcmp(*p1, *p2));
}

See Also

alloca(),
arena,
calloc(),
free(),
libc,
memok(),
realloc(),
setbuf(),
stdlib.h
ANSI Standard, §7.10.3.3
POSIX Standard, §8.1

Diagnostics

malloc() returns NULL if insufficient memory is available.

Notes

The function alloca() allocates space on the stack.  The space so allocated
does not need to be freed when the function that allocated the space exits.