连续内存分配

3

我使用下面的代码来查找数组中两个连续内存块地址之间的差异。尽管每个项目(这里是“int”)的打印大小为4,但包含该项的两个相邻块之间的地址差距竟然是1。地址差应该是4,对吗?

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main() {
    int a[10];

    for(int i=0;i<10;i++)
        cin>>a[i];

    cout<<"size of 1 block = "<<sizeof(int)<<"\n";

    for(int i=1;i<10;i++){
    // cout<<"Difference between address of consecutive memory blocks\n";
       cout<<" "<<&(a[i])- &(a[i-1])<<"\n";
    }
    return 0;
}

输出

1个块的大小=4
1
1
1
1
1
1
1
1
1


3
了解指针算术运算。 - πάντα ῥεῖ
1
这段C++代码与C语言有什么关系?不要滥用不同语言的标签。 - too honest for this site
指针之间的差异是以对象数量而非字节数来表达的。 - NathanOliver
@Olaf:由于C++故意将这种算术运算与C相同。 - MSalters
你需要使用char类型来查看字节差异,例如:cout<<" "<< reinterpret_cast<const char*>(&(a[i])) - reinterpret_cast<const char*>(&(a[i-1]))<<"\n"; - marcinj
3个回答

1
这是因为指针算术&(a[i]) 的类型是可以存储 int 的内存块的 int* 指针。如果将此指针向前移动一个,则会指向下一个可以存储另一个 int 的内存块。这就是两个 int* 之间差异的原因为什么是 1

您可以打印出通过将 int* 指针类型转换为 char* 指针类型并计算差异来尝试实现的内容:

cout << (reinterpret_cast<char*>(&a[i]) - reinterpret_cast<char*>(&a[i - 1]));

1
“差异度量”是指int的数量,而不是char的数量——类型为T*的两个指针之间的差异是它们之间类型为T的对象的数量。
请注意,如果
int* p = &a[k];

那么

p + (&(a[i])- &(a[i-1])) == p + 1

也就是说,将相邻两个元素的差添加到 p 上会得到 p + 1,这正是您所期望的。

1
你可以通过将值转换为整数(例如unsigned long long)来获得预期的值:
cout << " " << (unsigned long long)&a[i] - (unsigned long long)&a[i-1] << "\n";

将类型转换为unsigned int对于32位系统足够。
如果不进行转换,则会进行指针算术运算,结果为1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接