请教一个用指针交换字符串中两个字符的有关问题

请问一个用指针交换字符串中两个字符的问题

void reverse(char *p1,char *p2)
{
       char temp=*p1;
       *p1=*p2;
        *p2=temp;
}

void main()
{
        char *S="i am a student";
        char *pbegin=S;
char *pend=S;
while(*pend!='\0')
{
pend++;
}
pend--;
reverse(pbegin,pend);
}

上面的代码是为了交换字符字符串中第一个字符和最后一个字符,但是会出现字符地址写入冲突?大侠帮忙
------解决思路----------------------
定义成数组吧,字符串常量只读
------解决思路----------------------
把char *S="i am a student";改成char S[]="i am a student"; 
------解决思路----------------------
char *S="i am a student";
这个应该定义为 
char const *S="i am a student";

这个 BUG 是因为历史原因。
------解决思路----------------------

void reverse(char *p1 ,char *p2)
{
char temp = *p1;
*p1 = *p2;
*p2 = temp;
}

void main()
{
char s[]="i am a student";
char *pstart = s;
char *pend=s;
while(*pend!='\0')
{
pend++;
}
pend--;
reverse(pstart,pend);
printf("c=%s\n",s);
}