dynarr(3pub)

dynarr3pub

Simple dynamic arrays

Usage

#include <publib.h>

void dynarr_init(struct dynarr *da, size_t elsize);
int dynarr_resize(struct dynarr *da, size_t newsize);
void dynarr_free(struct dynarr *da);

Overview

These functions make it easier to use dynamic arrays, i.e., arrays that are allocated with malloc(3) and resized with realloc(3). Below is a typical code fragment for implementing a dynamic array that is resized as more input is read.

char *p, *line;
size_t alloc, len;
len = 0;
alloc = 1024;
if ((line = malloc(alloc)) == NULL) abort();
while (fgets(line + len, alloc-len, stdin) != NULL) {
	len = strlen(line);
	alloc += 1024;
	if ((p = realloc(alloc)) == NULL) abort();
	alloc = p;
}

(The error handling is intentionally simplified.) Below is the above fragment with the dynarr(3).

struct dynarr da;
dynarr_init(&da);
while (fgets((char *)da.data + da.used, da.alloc-da.len, stdin) != NULL) {
	da.used = strlen(da.data);
	if (dynarr_resize(&da, da.alloc + 1024) == -1) abort();
}

The code is a bit simpler, and all the memory allocation details and most of the error checking code is hidden away.

The dynamic array is represented by a struct dynarr:

struct dynarr {
    void *data;
    size_t alloc, used;
};

The interface to the dynamic allocation has intentionally been made unopaque.

dynarr_init initializes a struct dynarr to be an empty array, dynarr_resize sets its size to be newsize, and dynarr_free frees the array (it will become an empty array again).

Returns

dynarr_resize returns -1 if it failed, 0 if it succeeded. It does not change the array in any way if it failed.

Releases

16 releases since Debian 1.2 (Rex); the text changed 4 times.

  1. 1.2–1.3
  2. 2.0–2.2
  3. 3.0
  4. 3.1–6.0
  5. 7–13

Author

Lars Wirzenius ([email protected])

From publib-dev 0.40-4 in Debian 13 (Trixie). Parsed by carta from the page's man source.