语句解析的简单程序,为什么会报错(问题在代码中)?

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
void ParseAssign(char*str,char*pVar,int*pVal){
    int ep;
    for(int i=0;i<strlen(str);i++){
        if(isspace(str[i])){
            for(int j=i+1;j<strlen(str);j++){
                *(str+j-1)=*(str+j);
            }
        }
        if(str[i]=='='){
            ep=i;
        }
    }
    for(int i=0;i<ep;i++){
        *(pVar+i)=*(str+i);
    }
    *(str+strlen(str)-1)='\0';//为什么segmentation fault?为什么这时候不能直接赋值?
    *pVal=atoi(str+ep+1);

}
int main(){
    char pVar[30];
    int pVal[1];
    //char str[30]="x=31;";//ParseAssign(str,pVar,pVal)为什么将下一行代码换成这样就不会报错了?
    ParseAssign("x=31;",pVar,pVal);
    puts(pVar);
    for(int i=0;i<1;i++){
        printf("%d",pVal[i]);
    }
    return 0;
}

char str[30]="x=31;"
此时str是常量,不能修改