我所知,应该计算*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,就无法以任何方式验证或证明输出(如果有(。