C风格数组和C++vector容器的越界问题

首先,可以思考一个问题:

如果有一个容量为5的数组,我们却调用它的第六个元素,会产生什么结果呢?

我在微信群里跟几个同学讨论,然后看到了很多不同的声音。

首先,需要明确使用的编程语言,因为不同的编译器确实可以造成不同的结果。就我熟悉的C语言和C++来说,就有着一定的差异。

对于C语言,数组变量保存在一个专门开辟出来的栈当中,因此,如果是小范围的越界调用,并不会造成灾难性的后果,比如以下程序。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	int a[]={ 0,1,2,3,4 };
	printf("%d\n", a[5]);
	getchar();
	return 0;
}

对于小范围的调用,都可以随机产生一个int型变量。但直接调用a[1000]这么大的范围,程序就会报错。

另一方面,对于C++语言的vector容器,任何小小的超出范围,程序都会报错。

#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> a{ 0,1,2,3,4 };
	cout << a[5] << endl;
	getchar();
	return 0;
}

从这个角度来看,C++的STL库还是有着自己的优势,vector这种严格打造的数据容器,可以有效防止越界调用的发生。

虽然在一些文章上看到说很多公司做C++的都不喜欢用STL库,但我觉得,存在就是有道理的,它确实防止了我这种初学者犯一些低级错误,减少了bug发生的可能性。对于我这种非专业程序员,我用着舒服方便是最重要的,效率某些情况下并不是我最考虑的因素,所以我还是打算继续把STL用下去。

用着方便,它不香吗?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值