首页 > 解决方案 > 为什么这里没有发生分段错误?

问题描述

如果我没有定义向量的大小,则会发生分段错误,但是这样,我的意思是我定义的大小低于我使用的大小,就不会发生分段错误。但为什么?他们有什么区别?

#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++segmentation-fault

解决方案


C++ 有一个未定义行为的概念。越界访问向量是未定义行为的典型示例(因为vector::operator[]不执行边界检查)。关于该计划的结果,没有什么有意义的说法。

但要解释可能发生的事情......

Avector通常class包含指向堆分配数组的指针及其大小(“容量”)。

空向量具有空指针值。取消引用空指针通常会立即导致段错误,因为在地址 0 处没有分配虚拟内存区域。

另一方面,容量向量2指向一个大小为 的数组2。写过去通常是可能的,您只需覆盖恰好位于该数组之后的堆内存。这称为堆缓冲区溢出。在一个简单的程序中,它可能看起来工作正常。但是在一个更大的程序中,在代码后面的某个地方不会发生任何好事。


推荐阅读