我有两个几乎相同的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作为输出。
究竟发生了什么?
答案 0 :(得分:2)
正在发生的事情是未定义的行为。
当您获得指向int
的指针时,您可以单独使用该指针的值;指针算术没有意义。
为了使p+1
生成一个可以取消引用的地址,p
必须指向除最后一个元素之外的数组元素。在所有其他情况下,未定义阅读*(p+1)
。
除了标准之外,CPU必须从某些位置获取该值。您假设该地点必须是b
的地址,该地址在a
之后立即声明。但是,C ++不保证局部变量在内存中的位置相对于彼此。似乎编译器重新排序你的变量,产生一个你没想到的输出(并且它无论如何都是未定义的)。
答案 1 :(得分:1)
*(p+1)
在 a
之后访问内存,因此它是未定义的行为。
您是否打算(*p)+1
将a
增加1?