What is static in C?

Like void, the keyword static is another of those overloaded keywords. It has different meanings in different syntactic forms.

1: To modify a variable declaration inside a function body, e.g.

int incr(void) {
  static int ctr;
  ctr++;
  return ctr;
}

This example is equivalent to:


int fresh_1;

int incr(void) {
  fresh_1++;
  return fresh_1;
}

... where fresh_1 is a fresh variable, i.e. not used elsewhere in the program.

2: To modify a variable declaration outside a function body, e.g.

static int ctr;
int incr(void) {
  ctr++;
  return ctr;
}

This is also equivalent to

int fresh_1;

int incr(void) {
  fresh_1++;
  return fresh_1;
}

where fresh_1 is a fresh variable, i.e. not used elsewhere in the program (specifically, other translation units).

3: as a modifier to an array length in the type of a function parameter, e.g.:

int foo(int bar[static 10]) {
  return bar[9];
}

Here, static 10 means “bar points to an array of at least length 10”.

A commenter on SO mentions a very useful trick: instead of taking an argument of type struct foo *, a function can instead take an argument of type struct foo [static 1], which makes the stronger statement that foo points to memory of at least size sizeof(struct foo). That is, [struct 1] is a way to annotate an argument as being non-null!

Unfortunately it seems you can’t use this notation in general types. Is it exclusive to function parameters of the form T x[static n]?

Tagged #c, #programming.
👋 I'm Jim, a full-stack product engineer. Want to build an amazing product and a profitable business? Read more about me or Get in touch!

More by Jim

This page copyright James Fisher 2016. Content is not associated with my employer. Found an error? Edit this page.