Listing 1: A flexible array member

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// The representation of a PL/I string
struct PLIstring {
  unsigned short count;
  // s is a flexible array member
  char s[];
};

// Convert the C language string cstr to a PL/I string
// allocated on the heap
struct PLIstring *toPLI(char *cstr)
{
  struct PLIstring *pli;
  size_t len = strlen(cstr);
  // We allocate len extra bytes as storage for the s array
  pli = malloc(sizeof (struct PLIstring) + len);
  assert(pli != NULL);
  pli->count = len;
  // Copy len bytes into the flexible array s.  Note the zero byte
  // ending the C string is not copied.
  memcpy(pli->s, cstr, len);
  return pli;
}

int main(int argc, char **argv)
{
  int i;

  // Convert our program arguments to PL/I strings and print them
  for (i = 0; i < argc; ++i) {
    struct PLIstring *pli = toPLI(argv[i]);
    // print the PL/I string.  By specifying a precision for %s, we
    // can force it to stop printing before finding a zero byte.
    // By making the precision be *, we can pass it as an argument
    // to printf.
    printf("count=%hu, s=\"%.*s\"\n", pli->count, pli->count, 
        pli->s);
  }

  return EXIT_SUCCESS;
}
— End of Listing —