请问个指针传参的有关问题

请教个指针传参的问题void myToUpper(char* str){while(*str){if(*stra&&*strz)*str+A-a++s

请教个指针传参的问题
void myToUpper(char* str)
  {
       while(*str)
     {
           if(*str>='a'&&*str<='z')
               *str+='A'-'a';
               ++str;
       }
  
  }
  
  int main()
  {
      char* str = "haLLo!";
      myToUpper(str);
      puts(str);
  }   

这样为什么会出现段错误,若把char* str = "haLLo!";改为char str[10]="haLL0!";却不会出错···
[解决办法]
一个char的空间是多少。
"haLLo!"的空间是多少。