0
int main()
{
  char *p="abcd";
  while(*p!='\0') ++*p++;
  printf("%s",p);
  return 0;
}

我无法理解为什么代码不运行。问题出在语句中++*p++,但问题是什么?

4

4 回答 4

1

P*p="abcd"; 通过++*p++尝试修改字符串' '来指向常量字符串文字"abcd",例如a在字符串中将递增到,'b'因为++*p这是未定义的行为(常量字符串不能更改)。它可能会导致分段错误。

`++*p++` means `++*p` then `p++`
                 ^
                 | this operation try to modify string constant 
于 2013-05-18T04:40:06.363 回答
0
 char *p="abcd";

p 指向一个只读段,您不能像在此处那样增加 p

while(*p!='\0') ++*p++;
于 2013-05-18T05:30:49.477 回答
0
char *foo = "abcd";
char bar[] = "abcd";

foo考虑和之间的差异barfoo是一个初始化为指向为字符串文字保留的内存的指针。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;
}
于 2013-05-18T09:04:39.940 回答
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"
于 2013-05-18T08:37:03.457 回答