С технической точки зрения, для компилятора C90 это невозможно.Для идиомы инициализации
декларатор = последовательность инициализации
последовательность инициализации должна быть константным выражением, т.е.во время компиляции или во время компоновки.Таким образом,
int a;
int *b[] = { &a };
работает, в то время как
void foo() {
int a;
int *b[] = { &a };
}
не будет, потому что адрес автоматического а не может быть вычислен до времени выполнения., последний будет работать.Ваш код, однако, все еще находится за пределами того, что компилятор C99 может предварительно вычислить.Если вы переключитесь на C ++, ваш код будет работать, по крайней мере Comeau не возражает.Редактировать: конечно, Роджер прав в том, что это не решит проблему неправильной разыменования через указатель NULL.