我正在使用C中的指针进行测试,当我尝试使用此代码时:
int main()
{
char * b = "abc";
char * c = b;
*c = *(b+1); //problem
printf("%s",c);
}
我在注释行上出错,我打算打印的是bbc,为什么指针分配不起作用?
答案 0 :(得分:4)
c
指向字符串文字,不允许修改字符串文字,它是undefined behavior。 C99标准部分6.4.5
字符串文字段 6 草案中包含了这一点,其中说明了(强调我的):
如果这些数组的元素具有不同的数据,则未指定 适当的价值观如果程序试图修改这样的数组,则行为是 未定义强>
所以这个程序的行为是不可预测的。
答案 1 :(得分:0)
变量b
和c
都指向同一个字符串,该字符串位于程序的(只读)代码部分。
在运行期间,当CPU执行*c = *(b+1)
时,它会执行非法的内存访问。
您应该将此字符串声明为函数main
中的本地数组,因此它将位于堆栈中:
char b[] = "abc";