C 正在尝试更改指针值

C 正在尝试更改指针值,c,pointers,memory,shortcode,C,Pointers,Memory,Shortcode,我正在用C语言的指针进行测试,当我尝试以下代码时: int main() { char * b = "abc"; char * c = b; *c = *(b+1); //problem printf("%s",c); } 我在评论行中出错了,我要打印的是bbc,为什么指针分配不起作用?c指向字符串文字,不允许修改字符串文字,是的。C99标准草案第6节“字符串文字”中包含了这一点,其中第6段(重点内容): 如果这些数组的元素具有 适当的值如果程序试图修

我正在用C语言的指针进行测试,当我尝试以下代码时:

int main()
{

    char  * b = "abc";
    char * c = b;

    *c = *(b+1); //problem
    printf("%s",c); 
} 

我在评论行中出错了,我要打印的是bbc,为什么指针分配不起作用?

c
指向字符串文字,不允许修改字符串文字,是的。C99标准草案第6节“字符串文字”中包含了这一点,其中第6段(重点内容):

如果这些数组的元素具有 适当的值如果程序试图修改这样的数组,则该行为为 未定义


所以这个程序的行为是不可预测的。

变量
b
c
都指向同一个字符串,该字符串位于程序的(只读)代码部分

在运行时,当CPU执行
*c=*(b+1)
时,它执行非法内存访问

您应该在函数
main
中将此字符串声明为本地数组,因此它将位于堆栈中:

char b[] = "abc";

修改字符串文字是未定义的行为。@BlueMoon接受的dup答案实际上非常糟糕,太糟糕了OP没有接受Keith的答案,您必须向下滚动才能找到。@ShafikYaghmour问题是dup,该页面中有正确的答案。当我投票结束时,这就是我所关心的。OP接受的东西不是我/任何人都能影响的。@BlueMoon可能有更好的DUP可供选择,似乎很少有用户关心他们选择的DUP的质量。无论如何,我敦促OP接受基思的答案,因为这显然是一个更好的答案,所以希望这会得到解决。