![]() |
Site Archive (Complete) | |||
|
ABOUT US |
CONTACT |
ADVERTISE |
SUBSCRIBE |
SOURCE CODE |
CURRENT PRINT ISSUE |
NEWSLETTERS
|
RESOURCES
|
BLOGS
|
PODCASTS
|
CAREERS
|
||||
March 01, 2002
The New C:VLAs, Part 4: VLA typedefs and Flexible Array MembersRandy Meyers
The Rest of the Story on variable-length arrays in C99. Yes, they're well-behaved and very flexible, but use them with caution.
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
|
|
||||||||||||||||||||||||||
|
|