int main()
{
char *p="abcd";
while(*p!='\0') ++*p++;
printf("%s",p);
return 0;
}
我无法理解为什么代码不运行。问题出在语句中++*p++
,但问题是什么?
int main()
{
char *p="abcd";
while(*p!='\0') ++*p++;
printf("%s",p);
return 0;
}
我无法理解为什么代码不运行。问题出在语句中++*p++
,但问题是什么?
P
*p="abcd";
通过++*p++
尝试修改字符串' '来指向常量字符串文字"abcd"
,例如a
在字符串中将递增到,'b'
因为++*p
这是未定义的行为(常量字符串不能更改)。它可能会导致分段错误。
`++*p++` means `++*p` then `p++`
^
| this operation try to modify string constant
char *p="abcd";
p 指向一个只读段,您不能像在此处那样增加 p
while(*p!='\0') ++*p++;
char *foo = "abcd";
char bar[] = "abcd";
foo
考虑和之间的差异bar
。foo
是一个初始化为指向为字符串文字保留的内存的指针。bar
是一个具有自己内存的数组,初始化为字符串文字;它的值是在初始化期间从字符串文字复制的。修改bar[0]
等是合适的,但不是foo[0]
。因此,您需要一个数组声明。
但是,您不能增加数组声明;这是指针变量或整数变量的操作。此外,您的循环p
在打印之前会更改指向的位置,因此您需要将字符串的原始位置保留在某处。因此,您还需要一个指针或整数声明。
考虑到这一点,将代码更改为如下内容似乎是个好主意:
int main()
{
char str[] = "abcd";
/* Using a pointer variable: */
for (char *ptr = str; *ptr != '\0'; ++*ptr++);
/* Using a size_t variable: */
for (size_t x = 0; str[x] != '\0'; str[x++]++);
printf("%s", str);
return 0;
}
//char *p="abcd";//"string" is const char, don't change.
char str[]="abcd";//is copied, including the '\0' to reserve space
char *p = str;
while(*p!='\0') ++*p++;
//printf("%s",p);//address pointing of 'p' has been changed
printf("%s",str);//display "bcde"