la memoria è obbligatoria allocarla solo nel caso dei puntatori, il tuo array contiene valori.

Se dichiari:

int* a;//LA MEMORIA NON E' ALLOCATA E TANTO MENO INIZIALIZZATA

int a;//la memoria è allocata ma non inizializzata

Come esempio riporto un programma che ha un array di puntatori a interi:

codice:
#include <iostream>

using namespace std;

int main() {
	int     a = 1;
	int	b = 2;
	int	c = 3;
	int	d = 4;
	int      t = 5;
	int *q[] = {&a,&b,&c,&d};

	q[5] = &t;

	for(int i = 0; i < 5; i++) {
		cout << *q[i] << " ";
	}


	return 0;
}
Eseguendo normalmente, vediamo scrivere: 1 2 3 4... e il 5? Non si vede, allora facciamo un debug e... eccolo! Access Violation! E l'indirizzo incriminato è proprio lui: 0xC0000005.
Quindi avremo:

0xC0000001 = 1
0xC0000002 = 2
0xC0000003 = 3
0xC0000004 = 4
----------------
0xC0000005 = 5// gli do il valore 5 senza aver allocato => Access Violation


Ho fatto adesso gli esperimenti, e nella speranza di non aver detto cacate, ciao