c++ - 为什么这里没有发生分段错误?
问题描述
如果我没有定义向量的大小,则会发生分段错误,但是这样,我的意思是我定义的大小低于我使用的大小,就不会发生分段错误。但为什么?他们有什么区别?
#include <iostream>
#include <string>
using namespace std;
#include <vector>
int main()
{
vector <string> a(2);
a[0]="hello world";
a[2]="maryam";
cout << a[0] << a[2];
return 0;
}
解决方案
C++ 有一个未定义行为的概念。越界访问向量是未定义行为的典型示例(因为vector::operator[]
不执行边界检查)。关于该计划的结果,没有什么有意义的说法。
但要解释可能发生的事情......
Avector
通常class
包含指向堆分配数组的指针及其大小(“容量”)。
空向量具有空指针值。取消引用空指针通常会立即导致段错误,因为在地址 0 处没有分配虚拟内存区域。
另一方面,容量向量2
指向一个大小为 的数组2
。写过去通常是可能的,您只需覆盖恰好位于该数组之后的堆内存。这称为堆缓冲区溢出。在一个简单的程序中,它可能看起来工作正常。但是在一个更大的程序中,在代码后面的某个地方不会发生任何好事。
推荐阅读
- docusignapi - API 返回 USER_LACKS_MEMBERSHIP 错误
- kotlin - ArrowKT - @optics 注释不生成代码
- file - Acumatica 中的文件上传和附加
- python - 导入副本不适用于 sublime text 3
- snomed-ct - SNOMED 是否为已变为非活动的代码提供升级地图?
- python - 在没有嵌套循环的情况下使代码运行得更快
- json - 如何从 Swift 中的 json api 获取这些特定数据集?
- websocket - 如何使用 Strimzi Kafka Bridge 作为流媒体服务
- python - 如何解析表示算术表达式的高度嵌套的json数据
- java - FileUtils:未找到 readLines 和 writeLines 方法