C++ 调试c+时出现问题+;VisualStudio中的代码指针

C++ 调试c+时出现问题+;VisualStudio中的代码指针,c++,C++,我将列出数组中的每个成员及其相应的寄存器地址位置。这是我的密码 // PointerDeferenceTest.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> using namespace std; int main() { int x=0, y=0;

我将列出数组中的每个成员及其相应的寄存器地址位置。这是我的密码

    // PointerDeferenceTest.cpp : Defines the entry point for the console application.
    //
    #include "stdafx.h"
    #include <iostream>
    using namespace std;
    int main()
    {
        int x=0, y=0;
        int *px, *py;

        int number[15] = {-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9};
        while (x<14)
        {
            px = &x;
            py = number+x;
            cout << x+1 << ", " << px << ", " << *px << ", " << py << ", " <<  *py << ", " << py++ << ", " << *(py++) << ", " << *(++py) << "  \n";
            ++x;
        }
        return 0;

}
我不知道我做错了什么。第四列(py)开始列出数组中的第四项。但是代码被设置为读取第一个(数字[0])。 有趣的W10 Visual studio社区2017编译64位

更新1:以回应PhoenixBlue的评论。修改数组示例以使用不同的数字

更新2:这是我的预期结果

1, 000000D7532FF874, 0, 000000D7532FF904, -1, 000000D7532FF900, -3, -1
2, 000000D7532FF874, 1, 000000D7532FF908, 0, 000000D7532FF904, -2, 0
3, 000000D7532FF874, 2, 000000D7532FF90C, 1, 000000D7532FF908, -1, 1
4, 000000D7532FF874, 3, 000000D7532FF910, 2, 000000D7532FF90C, 0, 2
5, 000000D7532FF874, 4, 000000D7532FF914, 3, 000000D7532FF910, 1, 3
6, 000000D7532FF874, 5, 000000D7532FF918, 4, 000000D7532FF914, 2, 4
7, 000000D7532FF874, 6, 000000D7532FF91C, 5, 000000D7532FF918, 3, 5
8, 000000D7532FF874, 7, 000000D7532FF920, 6, 000000D7532FF91C, 4, 6
9, 000000D7532FF874, 8, 000000D7532FF924, 7, 000000D7532FF920, 5, 7
10, 000000D7532FF874, 9, 000000D7532FF928, 8, 000000D7532FF924, 6, 8
11, 000000D7532FF874, 10, 000000D7532FF92C, 9, 000000D7532FF928, 7, 9
12, 000000D7532FF874, 11, 000000D7532FF930, 0, 000000D7532FF92C, 8, 0
13, 000000D7532FF874, 12, 000000D7532FF934, -858993460, 000000D7532FF930, 9, -858993460
14, 000000D7532FF874, 13, 000000D7532FF938, -858993460, 000000D7532FF934, 0, -858993460
   1, 000000D7532FF874, 0, 000000D7532FF904, -4, 000000D7532FF900, -3, -1
    2, 000000D7532FF874, 1, 000000D7532FF908, -3, 000000D7532FF904, -2, 0
    3, 000000D7532FF874, 2, 000000D7532FF90C, -2, 000000D7532FF908, -1, 1
    4, 000000D7532FF874, 3, 000000D7532FF910, -1, 000000D7532FF90C, 0, 2
    5, 000000D7532FF874, 4, 000000D7532FF914, 0, 000000D7532FF910, 1, 3
    6, 000000D7532FF874, 5, 000000D7532FF918, 1, 000000D7532FF914, 2, 4
    7, 000000D7532FF874, 6, 000000D7532FF91C, 2, 000000D7532FF918, 3, 5
    8, 000000D7532FF874, 7, 000000D7532FF920, 3, 000000D7532FF91C, 4, 6
    9, 000000D7532FF874, 8, 000000D7532FF924,4, 000000D7532FF920, 5, 7
    10, 000000D7532FF874, 9, 000000D7532FF928, 5, 000000D7532FF924, 6, 8
    11, 000000D7532FF874, 10, 000000D7532FF92C, 6, 000000D7532FF928, 7, 9
    12, 000000D7532FF874, 11, 000000D7532FF930, 7, 000000D7532FF92C, 8, 0
    13, 000000D7532FF874, 12, 000000D7532FF934, 8, 000000D7532FF930, 9, -858993460
    14, 000000D7532FF874, 13, 000000D7532FF938, 9, 000000D7532FF934, 0, -858993460

x==13
时,此代码是一个问题
py++
py
溢出,因此
py=&number[13]
在您将其递增两次之前。这是未定义的行为,可能导致任何结果


一旦修复了这个问题,您可能会遇到更多问题,但是未定义的行为非常严重,您无法在UB存在的情况下对小错误进行推理。UB太糟糕了,它看起来像是“时光倒流”。你不能说“Foo发生在UB之前,所以它应该不受它的影响”。既然UB可以做任何事情,它也可以改变过去

老实说,我看不出这段代码中的
px
有什么意义。在每次迭代中,您在
py
上滥用增量前后运算符是一个逻辑噩梦。
py
分配了自己的内存,
number
分配了自己的内存,并且从您的输出中,您打印了变量
py
的内存分配,因此,它不能说明
编号
的任何项的内存位置,因此您不能说您的输出是否指向列表的任何位置。@JoseECalderon“我在任何地方都看不到增量”您认为
py++
++py
是什么?@JoseECalderon不,不是。你误解了C++是如何发生的。在表达式中,可以按任何顺序计算片段(有些例外)。无法保证将从左到右对其进行评估。有些编译器会从右向左,有些会做其他事情。@JoseECalderon你应该读一下Whozcraig发布的链接,它会解释你的误解。@datell说实话,我不确定。我认为完全正确的答案取决于C++的版本。“我认为‘不要这样做’就够了。”丹姆说。但这绝对是错误的。您的第二个代码很好,第一个代码是未定义的行为或未指定的行为(我不确定是哪种)。@DanM.:关联性决定代码的解析方式,而不是执行方式。你的两个例子当然不同。C++中的语句按程序顺序排序,但子表达式不是。@约翰:通常只是未指定的行为。在这种情况下,
py
也会溢出
number[]
,这会将未指定的行为变成未定义的行为。更准确地说,非常确定预期的行为由这两个子句保证:更准确地说:
每个重载运算符在使用运算符表示法调用时都遵守其重载的内置运算符的排序规则。
在移位运算符表达式E1E2中,E1的每次值计算和副作用都在E2的每次值计算和副作用之前排序。所以看起来像是因为C++17
cout
cout << x+1 << ", " << px << ", " << *px << ", " << py << ", " <<  *py << ", ";
cout << py++ << ", ";
cout << *(py++) << ", ";
cout << *(++py) << "  \n";