C++ 为什么';这里不会发生分段错误吗?

C++ 为什么';这里不会发生分段错误吗?,c++,segmentation-fault,C++,Segmentation Fault,如果我没有定义向量的大小,分割错误就会发生,但是通过这种方式,我的意思是,我定义的大小小于我使用的大小,分割错误就不会发生。但是为什么呢? 他们之间有什么区别 #include <iostream> #include <string> using namespace std; #include <vector> int main() { vector <string> a(2); a[0]="hello world&quo

如果我没有定义向量的大小,分割错误就会发生,但是通过这种方式,我的意思是,我定义的大小小于我使用的大小,分割错误就不会发生。但是为什么呢? 他们之间有什么区别

#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;

}
#包括
#包括
使用名称空间std;
#包括
int main()
{
载体a(2);
a[0]=“你好,世界”;
a[2]=“maryam”;
cout未定义的行为(即使用
运算符[]
读取或写入向量末尾以外的内容)正是未定义的行为

它可能同样容易崩溃的大小2的情况下,似乎工作的大小为零

或者两者都可以在播放
maniacal\u lough.mp3
时格式化存储设备


未定义的行为对结果没有限制,您最好避免这种情况。

[]运算符没有范围检查。[]运算符用于根据偏移量值和“基”地址直接访问内存地址。 从你的例子来看

a[0], a[2]
0和2是偏移量值,“基”地址将是向量指向的数组地址。
如果要进行范围检查,请使用:

a.at(0), a.at(2)
C++有一个概念。访问超出边界的向量是未定义行为的典型示例(因为不执行边界检查)。对于程序的结果,没有任何有意义的东西可以说

但为了解释可能发生的事情

向量
是一个
,通常包含指向堆分配数组及其大小(“容量”)的指针

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


另一方面,一个容量向量
2
指向一个大小为
2
的数组。通常可以将其写过去,您只需覆盖恰好位于该数组之后的堆内存。这称为a。在一个简单的程序中,它可以正常工作。但在一个较大的程序中,在下面是代码。

您导致了未定义的行为。本例中的行为是未定义的。分段错误只是未定义行为的一种可能结果。您的计算机可以订购比萨饼或格式化磁盘。您不应该期望任何结果。@ThomasSablik:这是相关的,但指的是实际数组而不是向量。我会让swarm来决定这是不是一个真正的傻瓜。