在c程序中使用++ * p ++会产生分段错误

时间:2015-11-04 17:26:28

标签: c pointers

代码:

#include <stdio.h>

int main(int argc, char const *argv[])
{
    char *p1="khan",*p2;
    p2 = p1;

    while ( *p1 != '\0')
    {
        // printf("I am in while.\n");
        ++*p1++;
        // printf("I am after ++*p1++.\n");

        printf("%c\n",*p1 );
    }
    printf("%s %s\n", p1,p2);
}

上面代码的编译给出了意想不到的结果:

  

分段错误(核心转储)

这是我所期待的:

++*p1++;
  1. Post ++有更高的先验:p1 = p1 + 1.
  2. 现在,p1将指向p1 - &gt;小时。
  3. 我们在这里有两个运营商++*,*具有更高的预感。所以* p1会增加,我们有价值,* p1 = i;
  4. 现在,我应该得到&#34; ki ..&#34;在p1。但是,我无法在while循环中迭代一次。

     printf("I am in while.\n");
       ++*p1++; //getting error here.
     printf("I am after ++*p1++.\n"); //this line is never called
    

3 个答案:

答案 0 :(得分:2)

++*p1++;

等于

(++*(p1++));

尝试修改字符串文字。问题是:
修改字符串文字是未定义的行为。

因此p1应为const char*,在C ++中也严格执行。

尝试

char str[] = "khan";
char* p1 = str;
例如,

。这会将字符串存储在堆栈中,而不是存储在某些只读部分中。

答案 1 :(得分:2)

表达式

++*p1++

被解析为

(++ (* (p1 ++) ) )

并评估如下:

    评估
  1. p1++;表达式的结果是增量之前p1 的值;
  2. 取消引用1的结果
  3. 2的结果递增
  4. 介于1和现在之间的某处,p1会提前指向下一个元素。
  5. 您正在尝试更改段错误,因为您正在尝试更改字符串文字的内容,这是不允许的。将您的代码更改为

    char str[] = "khan";
    char *p1 = str;
    

    它应该有效。请注意,您的输出将为"libo",而不是"kibo"

答案 2 :(得分:-1)

实际上它是未定义的行为。

  

++ *的p ++

我们无法知道两个增量会发生在哪个顺序,实际上编译器也不会有任何想法。我们无法争辩说,因为post的优先级高于pre,并且因为*和++从左到右关联,所以你认为它会像这样发生:

p1++;
++(*p1);

但它可能以++(*p1)后跟p1++的另一种方式发生。字符串可以修改,字符串将变为

  

&#34;荔波&#34;

因为++只是说增量发生得晚,而不是立即发生。