字符串翻转,出现Segmention fault, 如何解决

字符串翻转,出现Segmention fault, 怎么解决
代码是实现字符串的翻转,先用一个指针移动到尾部,然后一头一尾两个指针交换数据,相互靠拢
结果出现Segmention fault

上代码
#include <stdio.h>

void reverse(char *str) {
    char *start = str;
    char temp = ' ';

    while(*str++);

    if (start == str)
        return;

     str--;
     while (start < str) {
        temp = *start;
        *start = *str;  //测试发现是这一行的原因,不知道为什么
        *str = temp;

        start++;
        str--;
   }

}

int main() {
    char *str = "abcde";
    reverse(str);
    printf("%s\n", str);
}

------解决方案--------------------
C 语言常见问题集

2.13 以下的初始化有什么区别?char a[] = "string literal"; char *p = "string literal"; 当我向 p[i] 赋值的时候, 我的 程序崩溃了。

字符串常量有两种稍有区别的用法。用作数组初始值 (如同在 char a[]  的声明中), 它指明该数组中字符的初始值。其它情况下, 它会转化为一个 无名的静态字符数组, 可能会存储在只读内存中, 这就是造成它不一定能被修改。 在表达式环境中, 数组通常被立即转化为一个指针  (参见第 6 章), 因此第二个声明把 p 初始化成 指向无名数组的第一个元素。
为了编译旧代码, 有的编译器有一个控制字符串是否可写的开关。

参见问题 1.11、 6.1、 6.2 和 6.6。

参考资料: [K&R2, Sec. 5.5 p. 104]; [ISO, Sec. 6.1.4, Sec. 6.5.7]; [Rationale, Sec. 3.1.4]; [H&S, Sec. 2.7.4 pp. 31-2]。