int main()
{
char *p="abcd";
while(*p!='\0') ++*p++;
printf("%s",p);
return 0;
}
我无法理解代码无法运行的原因。问题出在++*p++
语句中,但问题是什么?
答案 0 :(得分:1)
P
指向常量字符串文字*p="abcd";
,方法是++*p++
您尝试修改字符串“"abcd"
”,例如字符串中的a
将是由于'b'
未定义的行为(常量字符串不能更改),因此增加到++*p
。它可能会导致分段错误。
`++*p++` means `++*p` then `p++`
^
| this operation try to modify string constant
答案 1 :(得分:0)
char *p="abcd";
p指向一个只读段,你不能像在这里那样递增p
while(*p!='\0') ++*p++;
答案 2 :(得分: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"
答案 3 :(得分:0)
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;
}