指针aritmetic根据输出变化?

时间:2017-02-01 11:03:15

标签: c++ pointers

我有两个几乎相同的c ++位

#include <iostream>
using namespace std;
int main(){
    int a = 0;
    int b = 1;
    int c = 2;
    int d = 3;
    int *p = &a;
    cout << &c << endl;
    cout << *(p+1);
}

输出:

0x7ffd7b16998c

2

#include <iostream>
using namespace std;

int main(){
    int a = 0;
    int b = 1;
    int c = 2;
    int d = 3;
    int *p = &a;
    cout << &d << endl;
    cout << *(p+1);
}

产生输出:

0x7ffdb7ea105c

3

为什么*(p + 1)的值取决于我事先输出的值? 如果我删除该行

cout << &c << endl; 

完全我得到预期的1作为输出。

究竟发生了什么?

2 个答案:

答案 0 :(得分:2)

正在发生的事情是未定义的行为

当您获得指向int的指针时,您可以单独使用该指针的值;指针算术没有意义。

为了使p+1生成一个可以取消引用的地址,p必须指向除最后一个元素之外的数组元素。在所有其他情况下,未定义阅读*(p+1)

除了标准之外,CPU必须从某些位置获取该值。您假设该地点必须是b的地址,该地址在a之后立即声明。但是,C ++不保证局部变量在内存中的位置相对于彼此。似乎编译器重新排序你的变量,产生一个你没想到的输出(并且它无论如何都是未定义的)。

答案 1 :(得分:1)

*(p+1)a之后访问内存,因此它是未定义的行为

您是否打算(*p)+1a增加1?