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



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

#include <stdio.h>
    int main()
    {
        int x=5;
        int *ptr= &x;
        int val= *ptr++;
        printf("%in", val); 
        printf("%i", *ptr);
        return 0;
    }

我期望得到

5
//Some random value

但输出总是显示

5
5

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

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

程序具有未定义的行为的事实。您可以递增指针以指向某个对象(在您的示例中x(,但之后您不能取消引用它。这样做就是冒险超越一个格式良好的C程序所做的承诺。

关于printf("%i", *ptr);做什么没有理由,因为它可能会做任何事情。无论 C 标准放在您的程序上的任何保证在您进行访问的那一刻都会被没收。

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

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

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

 printf("%i", *ptr);

您正在尝试访问(取消重新(从程序的角度来看无效的内存。

请记住,由于使用后增量运算符,ptr本身得到了增加。现在它指向为变量x分配的地址。然后,您尝试取消引用地址以获取值。这会导致无效的内存访问,进而导致未定义的行为。

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

相关内容

  • 没有找到相关文章

最新更新