【C++ | vector】关于vector变量的地址和首元素地址不相同的问题

博客探讨了C++中vector对象和其首元素地址的区别。在C++的实现中,vector对象本身存储在栈区,而其元素存储在堆区。通过代码示例展示了vector对象地址和首元素地址的不同,进一步说明了vector与数组在内存管理上的差异。此外,还提到了new关键字在堆区分配内存的情况作为对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景

一次debug中发现使用&vec&vec[0]得到的两个地址居然不相同,即vector的对象存放的地址首元素地址不相同。在C++中与vector最类似的数据结构是数组,而对数组进行取变量名地址和取首元素地址的结果是相同的,并且都存放在栈区。向量vector显示出了与数组不一样的特征

解释分析

在查询资料和实践后,得到了如下的解释:在C++中,vector的对象存放在栈区,元素存放在堆区,且变量名地址中存放的是堆区元素的首地址

代码实践

void test()
{
    vector<int> v;
    for (int i = 0; i < 3; i++)
    {
        v.push_back(i);
    }
    cout<<&v<<' '<<&v[0]<<endl;
}

int main()
{   
    test();
    vector<int> v1;
    for (int i = 0; i < 5; i++)
    {
        v1.push_back(i);
    }
    cout<<&v1<<' '<<&v1[0]<<endl;
    int *p = new int(10);
    cout<<p<<endl;
}

结果为
0x61fd80 0xe460a0
0x61fdf0 0xe460c0
0xe460a0

根据已知,因为指针p指向用new关键字开辟的一块内存空间,所以肯定存放在堆区,而vector对象的首元素地址的前几位和p指向的堆区的内存空间相同,所以vector的元素存放在堆区。反之vector变量名所存放的地址前几位与之差别较大,所以是存放在栈区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值