起初,这是一个“诡异”的故事~ ~匪夷所思啊!
故事发生在一个个月黑风高的夜晚,一个孤独的男人对着电脑做着一些让人浮想联翩的事情~~~
先看一段代码片段:
//进行词法分析
printf("\n------------------------------词法分析前:cur=%d\n", cur);
printf("\n------------------------------词法分析前:erro=%d\n", error);
toExpress(line, out);
printf("\n------------------------------词法分析后:cur=%d\n", cur);
printf("\n------------------------------词法分析后:erro=%d\n", error);
报错了:
来看它的输出结果:
或许单看这些并没有什么奇怪的,一bug罢了。但是,让人百思不得其解的是toExpress(line, out);这个函数内没有cur和erro半毛钱关系,它怎么就报错了呢!!!那个男人针对cur这个变量浮想联翩,滴bug 滴了若干个漆黑的夜晚这个bug依然阴魂不散,无奈之下,转念一想,能群殴何必单挑呢,叫队友呗,只好请高人CodeSlogan指点。
原来呀,初始化上存在问题,在循环中,另外一个全局计数变量没有在每次循环开始时重新进行初始化,导致数组越界,虽然这个数组越界不要紧,要紧的是它越界之后将接连定义的cur和error变量内存内的数据覆盖才导致了这个诡异的事件。
男人恍然大悟,醍醐灌顶啊!不得不说,CodeSlogan 果然功力深厚呀!
针对这个可恶的bug,男人痛定思痛,在这个月黑风高的夜晚,含泪整理了有关“引发了异常: 读取访问权限冲突。”常见的可能情况:
一、访问数组越界
若将要读取数据的位置超出了当前数组的长度,就会发生数组访问越界的状况。有的时候编译器并不会通知你越界了,太坑爹了。同时,要透过表象看实质,有的时候我们通过调试发现错误时是另一个变量莫名其妙的变成了一个超级大的数,但是,如果我们纠结于这个变量的值就会被蒙蔽了双眼,要深刻思考在内存中的数据情况,很可能是另一个数组越界导致将其数据覆盖
二、空指针/指针越界
天下苦指针久矣,C++为什么难,指针可谓立下汗马功劳。出现空指针异常时,同样很多情况下编译器不会报错。有的时候不初始化指针或者指针越界,就会使指针指向了一个不确定的值,从而发生访问冲突。