Error de infracción de acceso al revertir una cadena c ++ [duplicar]

Posible duplicado:
¿Por qué aparece un error de segmentación al escribir en una cadena?

La siguiente función simple debería revertir una matriz de caracteres en su lugar.

void reverse(char* str)
{
    char* last = str;

    // find end of the string
    while(*last) {
        ++last;
    }

    // swap characters until the pointers meet in the middle
    while(str < last)
    {
        --last; 
        char temp = *str;
        *str = *last;
        *last = temp;
        ++str;
    }
}

int main()
{
    char* a= "Hello";
    reverse(a);
    return 0;
}

El código compila. Pero arroja un error de tiempo de ejecución sobre la violación de acceso. Según el depurador, el culpable es la siguiente línea:

char temp = *str;

¿Alguna idea de por qué sucede?

Respuestas a la pregunta(1)

Su respuesta a la pregunta