C++的容器中提供了array即数组,但是我们一般很少用,而是一般用自己创建的静态数组如int arr[10],那么这两者有什么区别呢.
以下代码均在VS2022Debug版本下运行
array与静态数组的最主要的区别就是边界检查和安全性的问题
首先来看静态数组:
#include <iostream>
using namespace std;int main()
{int arr1[10] = {0};arr[10] = 10;return 0;
}
那么我们发现尝试越界写的时候报错了。
我们来看另一个情况,
#incldue <iostream>
using namespace std;int main()
{int arr1[10] = {0};arr1[12] = 12;return 0;
}
但是在运行后此时又发现没有问题
这说明编译器对这个arr1的越界写检查是一种抽查 并不一定是越界写就会报错。这会带来一些安全问题。
同时我们要注意的是,编译器对于这种静态数组没有进行越界读的检查,也就是当我们cout << arr1[10]时,
我们发现随机输出了一个值,并没有报错。
结论:对于静态数组,编译器只进行越界写检查且是抽查,而不进行越界读检查。
而对于array
#include <iostream>
using namespace std;
#include <array>
int main()
{ array<int,10> arr2;arr2[10] = 10;cout << arr2[10] << endl;return 0;
}
当我们进行越界读和越界写时都会进行报错
因此,array对越界写和越界读机制检测更为严谨。
结论:array对越界读和越界写有着严格的检查。
同时二者还有一些其他的区别,如array是模版类,提供了一些更便捷的方法,以及array可以直接赋值,而静态数组不能直接进行赋值操作等。
当然我们这里主要讲的是越界检查和安全性的问题。
在实际中,我们可以根据不同需要使用不同的形式实现数组。