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

Does *ptr++ has a side effect on the next memory location?

据我所知,应该计算 *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

那么我在这里错过了什么?

你所有的知识都是正确的,none你的期望是正确的。

具体来说,在你的情况下,问题

 printf("%i", *ptr);

您正在尝试访问 (de-rererence) 从您的程序的角度来看无效 的内存。

请记住,由于 post-increment 运算符的使用,ptr 本身增加了。现在它指向分配给变量 x 的地址。然后,您正在尝试 de-reference 地址来获取值。这会导致无效的内存访问,进而导致 undefined behavior.

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

So what I'm missing here?

你的程序有未定义的行为。您可以增加指针以指向一个对象(在您的示例中为 x),但之后您可能不会取消引用它。这样做就是冒险超越 well-formed C 程序做出的承诺。

printf("%i", *ptr); 的作用没有理由,因为它可以做任何事情。一旦您执行该访问,任何保证您的程序的 C 标准都将被没收。

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