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.

Similar posts

More by Jim

👋 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!

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