今天在用C学习指针时,我遇到了一个问题。我写了这段代码:
#include<stdio.h>
int main()
{
char *p="XAD";
printf("%c\n",(*p));
printf("%c\n",++(*p));
return 0;
}
首先printf()显示正确的输出,它是 X 。但对于第二个输出,编译器崩溃。但为什么?如果(* p)给出'X'(如预期的那样),则++(* p)应该给出'Y'。不应该吗?
答案 0 :(得分:2)
下面:
char *p="XAD";
您创建一个指针p
并将其指定给字符串文字"XAD"
。 字符串文字是不可变的,这意味着它无法更改。 ++(*p)
取消引用指针p
并递增它,从而尝试更改字符串文字的内容(特别是第一个字符)。尝试修改字符串文字会导致Undefined Behavior,如C11标准中所示(强调我的):
6.4.5字符串文字
[...]
- 如果这些数组的元素具有适当的值,则未指定这些数组是否相同。 如果程序试图修改此类数组,则行为未定义
醇>
<小时/> 通过将
p
声明为数组或使用(*p)+1
而不是++(*p)
来解决问题。使用前者不会修改字符串文字的内容,而后者则会这样做。
答案 1 :(得分:1)
指针p
指向字符串文字。修改字符串文字会导致C中未定义的行为
更改
char *p="XAD";
到
char p[]="XAD";
允许您修改它,因为此处p
是一个数组。
虽然char *p="abc";
在C中完全有效,但一般情况下,字符串文字应使用const
关键字声明,因为无论如何都不允许修改它。这将有助于捕捉意外的变化。它应该 类型为 const char [] ,但它的类型为 char [] ,因为&#34;历史&#34;原因(C ++纠正了它)。
或者您只是对打印修改后的值感兴趣,您可以这样做:
printf("%c\n", (*p) + 1);
由@alk建议,它执行代码尝试执行的操作但不修改字符串本身。