You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取std::vector越界下标对应的地址是否和数组一样具备安全保证?

问题结论

std::vector的&vec[size()]操作不具备和数组尾后取址同等的安全保证,属于C++标准规定的未定义行为。

数组尾后取址合法的原因

《C++ Primer 第五版》提到的数组尾后取址是被C++标准明确支持的合法操作:
数组的下标运算arr[n]等价于*(arr + n),因此&arr[10](数组长度为10)实际等价于&*(arr + 10),这里的解引用操作和取地址操作会被抵消,不会真的访问不存在的元素,只要后续不解引用这个尾后指针就完全合法。

相关代码示例:

int arr[] = {0,1,2,3,4,5,6,7,8,9};
int *e = &arr[10]; // 合法,指向数组尾后位置

vector下标取尾后地址非法的原因

std::vector的operator[]的标准语义要求:传入的下标必须落在[0, size())的范围内,下标等于size()本身就违反了operator[]的前置约束,不管你后续是否对返回值取地址,只要调用了vec[size()]就已经触发未定义行为。
实际开发中,很多标准库实现的Debug版本会给operator[]加边界断言检查,执行vec[10](vec长度为10)时会直接崩溃,完全不存在安全保证。

相关代码示例:

vector<int> vec(10, 0);
int *e = &vec[10]; // 未定义行为,不保证安全

正确获取vector尾后指针的方式

如果需要得到和数组尾后指针语义一致的合法指针,应该使用data()方法获取底层数组指针再做偏移:

vector<int> vec(10, 0);
int *e = vec.data() + vec.size(); // 合法,标准明确支持

内容的提问来源于stack exchange,提问作者Rodrigo Salazar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:24:01