为什么下列代码会报错

为什么会报错?
问题:编写一种方法,将字符串中的空格全部替换为%20。假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的“真实”长度。


char* replaceSpaces(char* S, int length){
    int count=0;
    for(int i=0;i<length;i++)
    {
         if(S[i]==' ')
         count++;
    }
    if(count==0)
    return S;
    int newlength=length+count*2;
    S[newlength--] = '\0';
    for(int i=newlength-1;i>=0;i--)
    {
        if(S[i]==' ')
        {
            S[newlength--]='0';
            S[newlength--]='2';
            S[newlength--]='%';
        }
        else
        {
            S[newlength]=S[i];
            newlength--;
        }
    }
    return S;
}

第十三行改一下:newlength 改为 length

for(int i=length-1;i>=0;i--) {
// 原来的内容不变
}


char *replaceSpaces(char *S, int length)
{
    char *t = "%20";
    char *tmp = (char *)malloc(length);
    int len;
    for (int i = 0; S[i]; i++)
    {
        if (S[i] == ' ')
        {
            len = length - i + 1;
            memcpy(tmp, &S[i + 1], len);
            memcpy(&S[i], t, 3);
            memcpy(&S[i + 3], tmp, len);
            length += 2;
        }
    }

    return S;
}