打印指针相关代码时编译器崩溃

时间:2015-05-24 13:39:54

标签: c pointers

今天在用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'。不应该吗?

2 个答案:

答案 0 :(得分:2)

下面:

char *p="XAD";

您创建一个指针p并将其指定给字符串文字"XAD"字符串文字是不可变的,这意味着它无法更改。 ++(*p)取消引用指针p并递增它,从而尝试更改字符串文字的内容(特别是第一个字符)。尝试修改字符串文字会导致Undefined Behavior,如C11标准中所示(强调我的):

  

6.4.5字符串文字

     

[...]

     
      
  1. 如果这些数组的元素具有适当的值,则未指定这些数组是否相同。 如果程序试图修改此类数组,则行为未定义
  2.   

<小时/> 通过将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建议,它执行代码尝试执行的操作但不修改字符串本身。