*(arr+len-1)=tmp; *(arr+len-1)为什么不能换成*(arr+j+1)

void move(char *arr,int k,int len)
{
    for(int i=0;i<k;i++)
    {
        int tmp=*arr;
        int j=0;
        for(j=0;j<len-1;j++)
        {
            *(arr+j)=*(arr+j+1);
        }
        *(arr+len-1)=tmp;//能不能写成*(arr+j+1)=tmp,为什么此时*(arr+j+1)的值为0
    }
}
int main()
{
        char arr[]="abcdef";
    int k=1;
    int len=strlen(arr);
//    scanf("%s",&k);
    move(arr,k,len);
    printf("%s",arr);
    return 0;
return 0;
}

*(arr+len-1)=tmp;
(arr+len-1)为什么不能换成(arr+j+1)

【以下回答由 GPT 生成】

问题的关键在于循环的控制条件和变量j的使用。

在函数内部的第二个循环中,循环的控制条件是j<len-1,这意味着j的取值范围是从0到len-2。循环体中的语句*(arr+j)=*(arr+j+1)是将当前位置的元素替换为下一个位置的元素,这是正确的。

然而,如果将*(arr+len-1)替换为*(arr+j+1),就会出现问题。因为在循环结束后,变量j的值是len-1,而数组的下标范围是从0到len-1,所以*(arr+len-1)就会超出数组的范围,访问到无效的内存位置。这样的行为是未定义的,可能会导致程序崩溃或产生其他错误结果。

此外,你提到“此时*(arr+j+1)的值为0”,这可能是因为在数组arr最后一个位置存储的是空字符('\0'),而空字符在C语言中表示字符串的结束。所以你看到的是空字符的ASCII码值0。这并不是*(arr+j+1)的真正值,将其替换到数组中可能会导致错误的结果。

总结起来,保持*(arr+len-1)不变是正确的做法,将其替换为*(arr+j+1)会导致访问无效内存并可能引发错误。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

for的最后一次循环时先j++,然后检测j发现不小于len,所以现在j=len-1,那么就应该是*(arr+j)