美文网首页
C++数组下标越界竟然不触发异常!!

C++数组下标越界竟然不触发异常!!

作者: 金戈大王 | 来源:发表于2017-05-22 19:25 被阅读186次

如题。

今天才发现,原来C++从来不检查数组索引是否越界。访问数组元素,比如a[3]时,编译器其实已经处理成了*(a+3),这时候已经没有数组的概念了,检查数组长度就更无从谈起。

这一特性使我遇到了一个非常大的BUG,把它简化成下面的代码:

#include <iostream>

int main() {

    double d[3] = {0, 1, 2};
    double dd = 9;

    d[3] = 0;

    std::cout << dd << std::endl;

    return 0;
}

输出结果是0而不是9。

也就是说,给d[3]赋值实际上赋到了dd头上去了。因为数组d和变量dd被依次定义,它们被安排在同一块内存空间的相邻位置,于是d[3]实际指向的是dd的内存空间,因此dd被改写。

在实际编程中,这样的问题很容易出现,但非常难排查。被覆盖的变量可以是基本数据类型,也可以是变量,还可以是指针。而且有时候变量并不一定按照定义时的顺序排列在内存中,编译器完全有可能做了额外的优化,重排这些变量的位置。据说C++是为了提高效率,才弱化了安全保护机制,毕竟两者不可兼得。

编程难,编C++更难,且编且珍惜。

相关文章

  • C++数组下标越界竟然不触发异常!!

    如题。 今天才发现,原来C++从来不检查数组索引是否越界。访问数组元素,比如a[3]时,编译器其实已经处理成了*(...

  • 异常——java学习之⑨

    1,常见异常 ArrayIndexOutOfBoundsException,数组下标越界异常 NullPointe...

  • 数据库常见的异常和错误

    空指针异常、指定类不存在异常、数学异常、非法参数异常、连接异常、数组下标越界异常。不兼容错误、连接错误、实例化错误...

  • java.lang.ArrayIndexOutOfBoundsE

    名字上看是数组下标越界错误,解决方法就是查看为什么下标越界。 如下: 12代表越界数组的下标, originalD...

  • Java进阶学习笔记终篇

    1、异常: 1.1 捕捉异常:数组下标越界 1.2 异常捕捉机制: 捕捉异常: 异常发生并不意味着程序一定要终止:...

  • kotlin精讲-第5章(7)数组下标越界问题

    数组下标越界,可以说是数组操作的一个经典问题。是什么数组下标越界呢?我们在用数组下标去获取元素的时候,如果给定的下...

  • Java--RuntimeException运行时异常--Ari

      派生于RuntimeException的异常,如被0除、数组下标越界、空指针等,其产生比较频繁,处理麻烦,如果...

  • Go 常见的引发 panic 的情况

    数组下标越界(运行时错误) 运行结果: 空指针异常(运行时错误) 运行结果: 类型断言失败(接口转换异常) 运行结...

  • 数组下标越界

    报错信息如下 我使用的是GridLayoutManager遇到的这种数组下标越界,于是我绞尽脑汁(其实也没有 哈哈...

  • 异常

    常见异常: 空指针异常指定类不存在异常数学运算异常非法参数异常请求不允许异常数组下标越界异常 常见错误 堆栈内存溢...

网友评论

      本文标题:C++数组下标越界竟然不触发异常!!

      本文链接:https://www.haomeiwen.com/subject/tfcixxtx.html