char *赋值的分段错误

我试图在下面的程序中为位置* p =’Z’理解char *赋值的分段错误

void main() { char *p ="abcdefg"; *p = 'Z'; } 

当谷歌搜索时,我确实找到了许多答案的链接,如下所示1.这是一个字符串文字,一旦分配不能更改其值2.字符串文字不能分配给* p 3.取一个可以改变的malloc …和等……

但我担心的是,如果字符串文字值不能改变,因为它是常量,当我们改变整数的常量值时,我们怎么不分段错误。 有人可以帮助我更好地理解这一点吗?

-Prashanth

这是未定义的行为。 如果您有一个常量字符串,标准表示可能不会修改字符串文字。 所以它是否可写是否取决于架构,它可能,也可能不是段错误。

更新从评论中添加。

 char *p ="abcdefg";// p is pointing a read only memory. *p = 'Z'; //You want write a read memoty . 

第一个*是点的变量,它表示p是一个指向char的点,因此int * p是指向整数值的点,这是点的变量。 p,而不是* p,是一个点,它的值是内存中char值的地址,你可以通过printf测试它(“p =%d”,p); p包含* p的值或char变量。 所以,你可以说* =“指针指向的值…”,和= =“值的地址……在内存中”。 所以,而不是char * p,temp; 温度= ‘A’; * p = temp;(指针p指向变量temp的值的值)

这是因为你正在使用*进行任务。 你的代码基本上是:在p的地址,它是类型pointer存储值Z,它是char类型。