代码:
#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++;
++*
,*具有更高的预感。所以* p1会增加,我们有价值,* p1 = i; 现在,我应该得到&#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
答案 0 :(得分:2)
++*p1++;
等于
(++*(p1++));
尝试修改字符串文字。问题是:
修改字符串文字是未定义的行为。
因此p1
应为const char*
,在C ++中也严格执行。
尝试
char str[] = "khan";
char* p1 = str;
例如,。这会将字符串存储在堆栈中,而不是存储在某些只读部分中。
答案 1 :(得分:2)
表达式
++*p1++
被解析为
(++ (* (p1 ++) ) )
并评估如下:
p1++
;表达式的结果是增量之前p1
的值; p1
会提前指向下一个元素。您正在尝试更改段错误,因为您正在尝试更改字符串文字的内容,这是不允许的。将您的代码更改为
char str[] = "khan";
char *p1 = str;
它应该有效。请注意,您的输出将为"libo"
,而不是"kibo"
。
答案 2 :(得分:-1)
实际上它是未定义的行为。
++ *的p ++
我们无法知道两个增量会发生在哪个顺序,实际上编译器也不会有任何想法。我们无法争辩说,因为post的优先级高于pre,并且因为*和++从左到右关联,所以你认为它会像这样发生:
p1++;
++(*p1);
但它可能以++(*p1)
后跟p1++
的另一种方式发生。字符串可以修改,字符串将变为
&#34;荔波&#34;
因为++只是说增量发生得晚,而不是立即发生。