c – Função dando erro segmentation fault

No código abaixo gostaria de implementar uma função que recebe uma string e a deixa em maiúsculo. Porém recebo o erro segmentation fault ao testar o código abaixo. Por quê?

#include <string.h> 
#include <ctype.h>

void maiuscula(char *str)
{
  for(int i = 0; i < strlen(str); i++)
    str(i) = toupper(str(i));
}

int main()
{
  char *str = "teste";
  maiuscula(str);
  printf("%sn", str);
  return 0;
}