c++ - 为什么两个指针之间的差异不等于类型的大小?

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

我有一个简单的程序:

#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

最佳答案

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

但是您可以按如下方式使用指针算法:

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 当然是无效的)。

关于c++ - 为什么两个指针之间的差异不等于类型的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44894091/

相关文章:

c++ - 当你用完 mlockall 设置的 ram 时会发生什么?

algorithm - 在循环中声明的变量是否使空间复杂度为 O(N)?

c++ - 素数的故障测试

c# - 命名管道客户端 (C++) 与 C# 服务器

c - 如何通过对结构中的名称使用 strcmp 将节点添加到列表中?

c++ - 是否为堆栈局部数组创建了指针变量?

python - 减少大量数据帧的 pandas concat 的内存使用量

c++ - Boost 图形库中的其他中心性度量

c++ - C/C++ 中的常量

c++ - bool 从结构导致 "error: expression must have class type"