指向下一个地址的指针

时间:2016-02-24 20:39:30

标签: c++ pointers cout

当你运行这样的代码时,它会显示d - >的值。 4 如果您取消注释cout<<& a,它会显示正确的值 - > 1

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int a=1,b=2,c=3,d=4;
    /*cout<<&a<<endl;
    cout<<&b<<endl;
    cout<<&c<<endl;
    cout<<&d<<endl;*/
    cout<<*(&b - 0x1);
}

有人可以帮我理解为什么cout会改变返回值吗?

3 个答案:

答案 0 :(得分:3)

没有这个陈述

cout<<&a<<endl;

变量a未在程序中使用。因此,允许编译器生成目标代码,使得a的定义不会包含在程序中。

取消注释此语句时,对象代码中存在变量a

考虑到一般情况下程序行为未定义。

如果变量不是数组的一部分,则不能在变量前取消引用。

cout<<*(&b - 0x1);

此外,编译器将变量放入内存的顺序是未指定的。

答案 1 :(得分:0)

您正在调用未定义的行为。

除非它是任何数组的一部分并且你的算术将值保存在数组中(或者超过它的一个结尾),否则执行修改这样的指针是没有效的。

因此,您正在访问某些内存的任意区域,并且没有您可能会收到的内容的定义。

当您注释掉这些行时,优化程序可能会注意到您没有使用v$parameterac,因此会从代码中省略它们。当你离开它们时,你会得到你期望的结果,因为你已经正确地推断出你的编译器(尽管并非所有编译器)相对于d(如果有的话)存储a。< / p>

优化程序不是必需的,并且通常不会尝试推断您b的访问恰好落在&b-0x01上。它的未定义行为与您得到的结果无关。

答案 2 :(得分:0)

根据定义,除非使用内存,否则C ++将从最后一个开始分配彼此相邻的所有地址。根据我的经验,他们彼此相邻。我能看到的唯一原因是因为如果没有使用优化a,就不会分配。 它总是显示d的值,这是最奇怪的部分。