连续的内存分配

时间:2017-06-13 17:04:47

标签: c++

我使用以下代码来查找数组中两个连续内存块的地址之间的差异。虽然每个项目的打印尺寸(此处为&#39; int&#39;此处)为4,但包含该项目的两个连续块的地址之间的差异结果为1.难道该差异不是4?< / p>

#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 个答案:

答案 0 :(得分:1)

这是因为pointer arithmetics&(a[i])的类型是int*,它指向可以存储int的内存块。如果您将此指针指向一,它将指向下一个可以存储另一个int的内存块。这就是两个int*之间差异为1的原因。

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

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

答案 1 :(得分:1)

&#34;差异措施&#34;是int s的数量,而不是char s - 类型T*的两个指针之间的差异是它们之间的T类型的对象数。

请注意,如果

int* p = &a[k];

然后

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

也就是说,将两个连续元素之间的差异添加到p会产生p + 1,这正是您所期望的。

答案 2 :(得分:1)

您可以通过转换为整数来获得预期的值,例如unsigned long long

cout << " " << (unsigned long long)&a[i] - (unsigned long long)&a[i-1] << "\n";

为{32}系统投射到unsigned int

如果没有转换,那么它会做指针算术,结果为1。