It's perfectly legitimate to use a variable in its own initializer. Consider a linked list:
#include <stdio.h>
struct node { struct node *prev, *next; int value; };
int main() {
struct node l[] = {{0, l + 1, 42}, {l, l + 2, 5}, {l, 0, 99}};
for (struct node *n = l; n; n = n->next)
printf("%d\n", n->value);
return 0;
}
In general, diagnosing when a value is used uninitialised is a difficult problem; although some compilers can detect it in some cases it doesn't make sense to require it to happen.