为什么*(str + i)=*(str + j)在这里不起作用?

Shi*_*hiv 4 c arrays string reverse pointers


void reverse(char *str){
    int i,j;
    char temp;
    for(i=0,j=strlen(str)-1; i<j; i++, j--){
     temp = *(str + i);
     *(str + i) = *(str + j);
     *(str + j) = temp;
     printf("%c",*(str + j));
    }
}



int main (int argc, char const *argv[])
{
    char *str = "Shiv";
    reverse(str);
    printf("%s",str);
    return 0;
}

当我使用char*str ="Shiv"时,我的反向函数的交换部分中的行,即str [i] = str [j]似乎不起作用,但是如果我将str声明为char str [] ="Shiv",交换部分有效吗?这是什么原因.我对这种行为感到有些困惑,当我试图运行程序时,我不断收到"Bus error"消息.

Sim*_*son 16

使用时char *str = "Shiv";,您不拥有指向的内存,也不允许您写入内存.字符串的实际字节可以是程序代码中的常量.

当你使用时char str[] = "Shiv";,4(+ 1)个char字节和数组本身就在你的堆栈上,你可以随意给它们写信.