* ptr ++对下一个内存位置有副作用吗?

时间:2018-03-22 07:39:32

标签: c pointers operators

据我所知,应评估*ptr++以获取原始ptr地址中的值,并更新ptr以指向下一个内存位置。因此,唯一应该改变的是ptr所持有的地址。 但是当我运行这个程序时

#include <stdio.h>

    int main()
    {
        int x=5;
        int *ptr= &x;
        int val= *ptr++;
        printf("%i\n", val); 
        printf("%i", *ptr);
        return 0;
    }

我希望得到

5
//Some random value

但输出始终显示

5
5

那我在这里错过了什么?

2 个答案:

答案 0 :(得分:3)

  

那么我在这里缺少什么?

您的程序有未定义的行为。您可以将指针递增到指向对象(在您的示例中为x),但之后您可能不会取消引用它。要做到这一点,就要冒险完成一个结构良好的C程序。

没有理由printf("%i", *ptr);做什么,因为它可以做任何事情。无论您在程序中使用C标准的保证在您访问时都会被取消。

除此之外,你似乎也是一个逻辑谬误的受害者。 5这里的随机性不亚于42,106或0xf00ba7。

答案 1 :(得分:2)

您的所有知识都是正确的,期望都不是。

详细说明,在您的情况下,问题

 printf("%i", *ptr);

您尝试从程序的角度访问(取消)无效的内存。

请记住,ptr本身会增加,因为后增加运算符使用。现在它指向为变量x分配的地址。然后,您尝试取消引用该地址以获取该值。这会导致无效的内存访问,从而导致undefined behavior

一旦你的程序导致UB,输出(如果有的话)就无法以任何方式验证或证明。