程序中的运行时错误

时间:2013-05-18 04:36:05

标签: c pointers runtime-error increment

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

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

4 个答案:

答案 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";

考虑foobar之间的差异。 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;
}