指针参数根据输出而变化

pointer aritmetic changes depending on output?

本文关键字:变化 输出 参数 指针      更新时间:2023-10-16

我有这两个几乎相同的 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

阿拉伯数字

#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 作为输出。

到底发生了什么?

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

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

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

撇开标准不谈,CPU必须从某个地方获取该值。你假设这个地方必须是 b 的地址,它紧跟在 a 之后声明。但是,C++ 不保证内存中局部变量相对于彼此的位置。编译器似乎对您的变量重新排序,产生您意想不到的输出(无论如何它都是未定义的)。

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

您可能打算(*p)+1a增加 1?