【问题标题】:Why difference between two pointers is not equals to size of type?为什么两个指针之间的差异不等于类型的大小?
【发布时间】:2017-12-07 05:24:32
【问题描述】:

我有一个简单的程序:

#include <iostream>

using namespace std;


int main()
{
    int a = 5;
    int b = 6;
    int* p1 = &a;
    int* p2 = &b;
    std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;

    system("pause");
    return 0;
}

它产生以下输出:

00DBF9B8 00DBF9AC ,sizeof(int)=4

但是,00DBF9B8 - 00DBF9AC == С。我无法理解这个结果。

如果我这样修改程序:

#include <iostream>

using namespace std;


int main()
{
    static int a = 5;
    static int b = 6;
    int* p1 = &a;
    int* p2 = &b;
    std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;

    system("pause");
    return 0;
}

我得到了正确的结果:

00394000 00394004 ,sizeof(int)=4

【问题讨论】:

  • 编译器不需要一个接一个地放置局部变量
  • 不能减去不指向同一个数组元素或数组后面第一个字节的指针。
  • @BaummitAugen:没有人在这段代码中做类似的事情。 OP 正在打印地址并手动计算差异。
  • @MatteoItalia 好点,谢谢。
  • 你一直在说“正确的行为”,但你没有表现出任何错误的行为,只是错误的假设。

标签: c++ pointers memory visual-studio-2015 memory-layout


【解决方案1】:

不能保证将局部变量(甚至静态变量)放在连续的内存地址上。实际上,如果您减去两个不指向同一个数组的指针值,这将是未定义的行为。

但是你可以使用指针算法如下:

int main()
{
    int a;
    int* p1 = &a;
    int* p2 = p1+1;
    std::cout << p1 << " " << p2 << " ,sizeof(int)=" << sizeof(int) << std::endl;

    return 0;
}

请注意,单个整数值可以被视为大小为 1 的数组,因此 p1+1 指向“数组的最后一个元素之后的一个”,因此操作 p2 = p1+1 实际上是有效的(取消引用p2 那么当然是无效的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2020-07-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多