递增指针时的模糊行为

时间:2012-10-21 16:50:26

标签: c pointers

#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));

}

第一,第二,第三印刷品的输出是'R','S'和&amp; 'R'(如预期的那样)。但行“(* ptr)++;”给运行时错误。有人可以解释原因吗?

4 个答案:

答案 0 :(得分:5)

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

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

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

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

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

答案 1 :(得分:0)

char * ptr =“Ramco Systm”

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

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

答案 2 :(得分:0)

(*ptr)++应为*(ptr++)

ptr指向第一个字符

(*ptr)返回实际值

(*ptr)++是一个错误原因(*ptr)会返回右值(在您的情况下为R),但无法分配或增加..还{{1}指向一个不能改变的常量(不是c ++的const)char!

您应首先增加ptr然后ptr增加dereference

<强>误读

*(ptr++)这样的

字符串文字 C 中始终被视为"xyz",但不能为char。它们声明为modified或按其他人声称不变。只是不允许更改或未定义

C ++ 字符串文字中表示为const字符不可用的字符

答案 3 :(得分: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指向的地址递增1,并指向下一个字符。