首頁 > 後端開發 > C++ > 在 C 中取得數組元素末尾一位的位址合法嗎?

在 C 中取得數組元素末尾一位的位址合法嗎?

Linda Hamilton
發布: 2024-12-18 01:40:10
原創
467 人瀏覽過

Is it Legal in C   to Take the Address of an Array Element One Past the End?

你能取得陣列元素的位址嗎?

下面的程式碼一直是程式設計中爭論的話題社群:

int array[5];
int *array_begin = &array[0];
int *array_end = &array[5];
登入後複製

具體來說,&array[5]在這種情況下是否是合法的C程式碼的問題有

C 標準的立場

根據 C標準,具體為:

  • §6.5.2.1:下標指定(E1[E2]) 相當於*((E1) (E2)).
  • §6.5.3.2:當您取得[]運算子產生的表達式的位址時,相當於將[] 替換為.

的意義&array[5]

將這些規則應用到&array[5],我們有:

  • &array[5] 相當於&array[0] 5。
  • &array[0] 5 點超過末尾的一個元素

合法嗎?

是的,合法。該標準明確允許指標指向超出數組末尾的一個元素,前提是它們沒有取消引用。在這種情況下,&array[5]僅用於取得位址,而不是存取該位址處的值,因此它在標準允許的範圍內。

為什麼與array 5 或&array[4] 1?

&array[5] 的行為與array 5 或&array[4] 1 不同,因為和[]運算子的優先權與[] 隱含的一元* 運算子的行為結合。具體來說:

  • 數組 5 被計算為 *(array 5),它試圖取消引用指向數組末尾的指針,這是未定義的行為。
  • &array[4 ] 1 被計算為&*(array 4) 1,這相當於數組5,因此也嘗試取消引用指向1 末尾的指針

相反,&array [5] 的計算方式就好像刪除了& 運算子並將[] 運算子變更為運算符,結果是數組5,但沒有對一元進行計算* 運算子。

以上是在 C 中取得數組元素末尾一位的位址合法嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板