1
#include<stdio.h>
main()
{

        char c = 'R';
        printf("%c\n",c);
        c++;
        printf("%c\n",c);
        char *ptr ="Ramco Systems";
        printf("%c\n",(*ptr));
        (*ptr)++;
        printf("%d\n",(*ptr));

}

第一个、第二个、第三个 printf 的输出是“R”、“S”和“R”(如预期的那样)。但是“(*ptr)++;”这一行 给出运行时错误。有人可以解释为什么吗?

4

4 回答 4

5

原因是因为指向的内存ptr是在编译时设置的并且是不可修改的。

因此通过访问第一个字符*ptr很好并返回R,但尝试增加第一个字符会产生运行时错误,因为不允许修改在编译时提供的字符串。

要在下面扩展 Seg Fault 的评论,编写代码的更好方法是:

const char *ptr ="Ramco Systems"; //pointer to const char
(*ptr)++; // yields compiletime error because *ptr is a const char

请注意,在这个新代码中,声明的指针类型更准确,因此编译器能够在第二行给出编译时错误(比运行时错误好得多)。

于 2012-10-21T16:54:37.050 回答
0

char *ptr = "Ramco 系统"

上面的语句变成了指向常量的指针,你试图修改它的无效内容,但是如果你希望编译器在编译时抛出错误,你可以使用/编写如下: const char * ptr = "Ramco System"

上述语句的行为方式相同。唯一的区别是当你写 (*ptr)++ 时,你会得到一个编译时错误,比如“修改只读位置”。在手上

于 2012-10-21T17:04:29.510 回答
0

(*ptr)++应该*(ptr++)

ptr指向第一个字符

(*ptr)返回实际值

(*ptr)++是一个错误原因(*ptr)将返回一个无法分配或递增的右值(在您的情况下)。.还指向一个无法更改的常量(不是 C++ 的常量)字符!Rptr

你应该首先增加ptr然后dereference它即*(ptr++)

误解

像这样的字符串文字"xyz"总是被视为charC中,但不能是modified。它们没有被声明为const或像其他人声称的那样是常量。只是不允许更改或未定义

C++中, 字符串文字表示为const无法更改的 char

于 2012-10-21T17:04:54.980 回答
0

也许你正在尝试做这样的事情?

  #include<stdio.h>
  main()
  {

    char c = 'R';
    printf("%c\n",c);
    c++;
    printf("%c\n",c);
    char aux[] = "Ramco Systems";
    char *p = aux;
    printf("%c\n",(*ptr));
    (*ptr)++;
    printf("%d\n",(*ptr));

}

但请记住,您取消引用的以下行然后递增:

    (*ptr)++;

所以它的行为如下:“我指向哪个字母?好的,将这个字母更改为下一个字母(ascii 代码高 1 个单位的字母)”在这种情况下,将 'R' 更改为 'S'。

如果你想要指向'a',你应该这样做:

  ptr++;

通过这样做,您将 ptr 指向的地址加一,传递指向下一个字符。

于 2012-10-21T17:46:04.457 回答