Se eu posso fazer isso:
pq não posso fazer isso?
Se eu posso fazer isso:
pq não posso fazer isso?
Não é proibido pela linguagem, mas provavelmente você vai acabar tendo algum erro de execução dependendo das opções do compilador. No Microsoft C++ a opção é /GF (enable read-only string pooling).
#include <stdio.h>
int main (int argc, char *argv[])
{
char *str1="String constante.";
str1[0] = 'q';
printf (str1); /* qtring constante */
}
Sem a opção /GF, ele roda do jeito que você achou que tinha de rodar (imprime "qtring constante"). Com /GF, o programa morre:

Strings literais são gravadas numa área especial da memória, que é read-only. Então, para o C, isso aqui:
É geralmente diferente disso aqui:
No primeiro caso, você obtém um ponteiro para essa região read-only. Na segunda, o compilador cria uma string fora dessa região.
Não me lembro o local no padrão onde isso está especificado. Se eu achar, comento aqui.