Salve a tutti.

Come da titolo, vorrei sapere la differenza nell'usare le stringhe nelle due forme consentite dal linguaggio C.

Nello specifico, invece, vorrei presentare un problema in cui mi sono appena imbattuto.
Ho scritto del codice totalmente "inutile" (giusto per curiosità e "divertimento"), e vi post il mio problema.

La prima versione, quella problematica, era la seguente:
codice:
int main(int argc, char **argv) {
	char *stringa = "Bla0 Bla1 Bla2 Bla3";
	char *temp;
	temp = strtok(stringa, " ");
}
strtok segnala un accesso illegale alla memoria, dovuto ovviamente da stringa.

Se invece modifico, utilizzando la seguente versione
codice:
int main(int argc, char **argv) {
	char stringa[128] = "Bla0 Bla1 Bla2 Bla3";
	char *temp;
	temp = strtok(stringa, " ");
}
funziona tutto bene.

Perchè? Se le due notazioni per indicare una stringa sono equivalenti, ed entrambe sono inizializzate nello stesso modo (e questo vuol dire che anche nel primo caso la memoria per contenere la stringa viene allocata), perchè il primo caso mi dà un accesso illegale in memoria?