回覆列表
  • 1 # 使用者2124022877881

    在標準中,寫陣列下標超出邊界的表示式是非法的。標準表示它的行為是未定義的。陣列名只包含地址資訊,並不包含該陣列長度的資訊,所以語言本身無法檢查,只能透過編譯器檢查。但是,很少有編譯器能夠監測到這類錯誤,即使提供了下標檢查的編譯器通常也會提供一個開關,允許你去掉下標檢查。下標檢查是很困難的一件事,原因在於下標引用可以作用於任意的指標,而不只是陣列名。例:int arr[10];//陣列元素初始化為0, 1, 2, ..., 9......int *parr = arr +3;//parr[0]對應於arr[3], 可以分解為 *(parr + 0)printf("%d", parr[0]); //列印 3//parr[7] 超出陣列下標 對應於arr[10]所以作用於指標的下標引用的有效性即依賴於該指標當時恰好指向什麼內容,也依賴於下標的值。要進行下標檢查,編譯器必須在程式中插入指令,證實下標表達式的結果所引用的元素和指標表示式所指向的元素屬於同一個陣列。這個操作的前提是得記錄程式中所有陣列的位置和長度等資訊。當程式執行時,這些資訊還得實時更新,以反映自動和動態分配的陣列。所以整個過程是既要花費空間還要花費時間的。很少有編譯器這麼做,即使做了也允許你關閉。Kenneth Reek - Pointers on C

  • 中秋節和大豐收的關聯?
  • iPhone 11會採用新介面嗎?