C++數組下標越界竟然不觸發異常!!

如題。

今天才發現,原來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語言最主要的風格之一。利用指針變量可以表示各種數據結構; ...
    朱森閱讀 3,473評論 3 44
  • 數組在程序設計中,為了處理方便, 把具有相同類型的若干變量按有序的形式組織起來。這些按序排列的同類數據元素的集合稱...
    朱森閱讀 4,002評論 2 13
  • 1.OC里用到集合類是什么? 基本類型為:NSArray,NSSet以及NSDictionary 可變類型為:NS...
    輕皺眉頭淺憂思閱讀 1,394評論 0 3
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,210評論 30 471
  • 踏入大學新社會 無知伴隨你左右 新鮮事物看不夠 有的只是一夜情 來來往往不知多 大多只是一過客 美女佳肴有好多 但...
    一御而飛閱讀 174評論 0 2