【问题标题】:Run-time error in program程序运行时错误
【发布时间】:2013-05-13 07:26:48
【问题描述】:
int main()
{
  char *p="abcd";
  while(*p!='\0') ++*p++;
  printf("%s",p);
  return 0;
}

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

【问题讨论】:

  • 解释一下你对这个程序的期望可能是个好主意,这样写答案的人就可以告诉你如何解决它。
  • 我希望输出是 - bcde

标签: c pointers runtime-error increment


【解决方案1】:

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

`++*p++` means `++*p` then `p++`
                 ^
                 | this operation try to modify string constant 

【讨论】:

  • 下一个错误会是当你的while() 终止并且你试图printf("%s",p); 不会打印任何东西时,你将p 指向'\0' .
【解决方案2】:
 char *p="abcd";

p 指向一个只读段,你不能像这里那样增加 p

while(*p!='\0') ++*p++;

【讨论】:

  • 我没明白...为什么我不能增加 p?
  • @Ceres111 答案中的陈述不正确......您可以增加p。你不能增加的是*p,因为正如 Uday 所说,p 指向只读内存。
【解决方案3】:
//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"

【讨论】:

  • 非常感谢。现在我懂了。这意味着 *p 可以递增,不是吗
【解决方案4】:
char *foo = "abcd";
char bar[] = "abcd";

考虑foobar 之间的区别。 foo 是一个初始化为指向为字符串文字保留的内存的指针。 bar 是一个数组,它有自己的内存,初始化为字符串文字;它的值是在初始化期间从字符串文字复制的。可以修改bar[0]等,但不能修改foo[0]。因此,您需要一个数组声明。

但是,您不能增加数组声明;这是指针变量或整数变量的操作。此外,您的循环在打印之前会更改p 指向的位置,因此您需要保留字符串的原始位置somewhere。因此,您还需要一个指针或整数声明。

考虑到这一点,将代码更改为以下内容似乎是个好主意:

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    相关资源
    最近更新 更多