C语言,用指针方式定义的字符串为什么不能修改?

char * p = "123";
*p = '0';//这样会出错

我并没有用const啊

"123"本身默认的就是一个字符串常量,他的值不容修改,p只是一个指针,执行该字符串的首地址,对该地址的值指向的地址空间的值的改变也是不允许的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-11-02
我也是今天在想这个声明模式跟char p [ ]="123";之间的区别时琢磨的。二维数组int a [ i ] [ j ],当把二维数组看成一维数组时声明指针变量是这样声明的:int *p=a[ i ],这个时候p指向的是元素类型为int型的一维数组的第一个元素;当以指针方式定义字符串的时候,同样的道理,指针p指向的是元素类型为字符数组的数组(大致如:a[ 0 ][ 0 ]={{123}},p=a[ 0 ]),此时p指向元素“123”的第一个元素‘ 1 ’。当以*p=‘0’这种方式赋值的时候相当于把char类型的值赋值给数组类型的变量!不知道说的够不够明白,第一次回答问题;碰巧我也在研究这个问题,搜了之后点进来发现你的问题跟我一样。只是自己的一点未经别人证实的想法。但至少让我不在这个问题上纠结。。。
第2个回答  2015-08-17
我的天啊!

char * p = "123";这是字符串类型的

然而
*p = '0';//这样会出错
你直接负一个字符给他,当然报错追问

……我想你们理解错了啊……或者是我没说清楚吧。
我并不是要做对比,第二句是接在第一句之后的。
也就是说,这是在同一个函数中的两句,
我的目的是修改第一个字符。

第3个回答  2023-03-10
根据C语言标准:字符串常量存储在同一位置,修改字符串常量可能造成其他程序字符串的修改;
ANSI C则声明如果对一个字符串常量进行修改,其效果是为定义的。它允许编译器把一个字符串常量存储于一个地方,即使它在程序中多次出现。这就使得修改字符串常量变得极易危险,因为对一个常量进行修改可能殃及程序中其他字符串常量。因此,许多编译器不允许修改字符串常量,或者提供编译选项,让你自行选择是否允许修改字符串常量。在实践中,请避免这样做,如果修改字符串,请把它存储于数组中。(摘自C语言标准)
相似回答