项目场景:
模拟实现string:模拟实现string中insert时,存在的越界问题
问题描述:
模拟实现string.insert(char* str)存在一个越界的问题,编译器没有报错。
string& insert(size_t pos,const char* str)
{
assert(pos <= _size);
size_t len = strlen(str);
if (_size + len > _capacity)
reserve(_size + len);
size_t end = _size + len;
while (end >pos)
{
_str[end] = _str[end - len];
end--;
}
strncpy(_str + pos, str, len);
_size += len;
return *this;
}
原因分析:
我们再看下面一个例子:
void test()
{
int arr[2] = { 0 };
arr[0] = 1;
arr[1] = 2;
arr[0] = arr[-1];
cout << arr[0] << endl;
cout << arr[1] << endl;
}
![在这里插入图片描述](https://img-blog.csdnimg.cn/8f328e64d014421da9bc05b7a0432868.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZW_5aSnTGVzbGll,size_20,color_FFFFFF,t_70,g_se,x_16)我们再看下一个例子:
![在这里插入图片描述](https://img-blog.csdnimg.cn/174c23b2de3f4790bbbff756f9ac7033.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6ZW_5aSnTGVzbGll,size_20,color_FFFFFF,t_70,g_se,x_16)
> 上面的例子说明了,当数组越界访问时,编译器是不会报错的,但是给越界的地址进行赋值,编译器就会报错。
# 总结
**因为C语言非常注重效率,所以不会检查数组的越界,而C++是继承了C语言的效率要求,数组越界后,会自动接着前面的那块内存往后写,但是这样可能会带来安全问题,因为我们不知道界外的内存存放了什么东西,如果界外存放了数据,那么数组越界后就会把这块内存上面的数据给覆盖掉。**
|