据我所知,应评估*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
那我在这里错过了什么?
答案 0 :(得分:3)
那么我在这里缺少什么?
您的程序有未定义的行为。您可以将指针递增到指向对象(在您的示例中为x
),但之后您可能不会取消引用它。要做到这一点,就要冒险完成一个结构良好的C程序。
没有理由printf("%i", *ptr);
做什么,因为它可以做任何事情。无论您在程序中使用C标准的保证在您访问时都会被取消。
除此之外,你似乎也是一个逻辑谬误的受害者。 5这里的随机性不亚于42,106或0xf00ba7。
答案 1 :(得分:2)
您的所有知识都是正确的,期望都不是。
详细说明,在您的情况下,问题是
printf("%i", *ptr);
您尝试从程序的角度访问(取消)无效的内存。
请记住,ptr
本身会增加,因为后增加运算符使用。现在它指向为变量x
分配的地址。然后,您尝试取消引用该地址以获取该值。这会导致无效的内存访问,从而导致undefined behavior。
一旦你的程序导致UB,输出(如果有的话)就无法以任何方式验证或证明。