亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過下標獲取一個過端數組元素的地址:C+標準是否合法?

通過下標獲取一個過端數組元素的地址:C+標準是否合法?

C++ C
森林海 2019-06-29 10:08:50
通過下標獲取一個過端數組元素的地址:C+標準是否合法?我已經多次看到它斷言C+標準不允許使用以下代碼:int array[5];int *array_begin = &array[0];int *array_end = &array[5];是&array[5]這種情況下的C+代碼合法嗎?如果可能的話,我想要一個參考標準的答案。知道它是否符合C標準也會很有趣。如果它不是標準的C+,為什么決定將它與array + 5或&array[4] + 1?
查看完整描述

3 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

是的,這是合法的。從C99標準草案:

第6.5.2.1條第2款:

后綴表達式,后面是方括號中的表達式[]是數組對象的元素的訂閱指定。下標運算符的定義[]那是E1[E2]是相同的(*((E1)+(E2)))..因為適用于二進制文件的轉換規則。+操作員,如果E1是數組對象(等價地,指向數組對象的初始元素的指針)E2是整數,E1[E2]指定E2-第四要素E1(從零算起)。

第6.5.3.2條第3款(重點是地雷):

一元&運算符生成其操作數的地址。如果操作數具有“類型類型‘,結果有類型’指向類型“”如果操作數是一元數據的結果*運算符,則該運算符和&運算符被計算,結果就好像兩者都被省略了一樣,只是對運算符的約束仍然適用,并且結果不是lvalue。同樣,如果操作數是[]運算符,既不是&運算符,也不是一元*,這是由[]值計算,結果就好像&運算符被移除,并且[]操作符更改為+操作者..否則,結果是指向其操作數指定的對象或函數的指針。

第6.5.6條第8款:

將具有整數類型的表達式添加到指針或從指針中減去時,結果具有指針操作數的類型。如果指針操作數指向數組對象的一個元素,并且數組足夠大,則結果指向與原始元素偏移的元素,從而使結果數組元素和原始數組元素下標的差值等于整數表達式。換句話說,如果表達式P指向i-數組對象的第四個元素,表達式(P)+N(相當于,N+(P))和(P)-N(在哪里N有價值n)分別指向i+n-第四和i?n-數組對象的第四個元素,只要它們存在。另外,如果P指向數組對象的最后一個元素,即表達式。(P)+1指向數組對象的最后一個元素,如果表達式Q指向數組對象的最后一個元素,即表達式。(Q)-1指向數組對象的最后一個元素。如果指針操作數和結果都指向同一個數組對象的元素,或者指向數組對象的最后一個元素,則計算值不會產生溢出;否則,行為將未定義。如果結果指向數組對象的最后一個元素,則不應將其用作一元的操作數。*計算的運算符。

注意,該標準顯式地允許指針在數組結束后指向一個元素,但前提是它們不被取消引用..由6.5.2.1和6.5.3.2&array[5]等于&*(array + 5),這相當于(array+5),它指向數組結束后的一個。這不會導致取消引用(6.5.3.2),因此它是合法的。


查看完整回答
反對 回復 2019-06-29
?
茅侃侃

TA貢獻1842條經驗 獲得超22個贊

合法的。

根據GCC編寫的C+文檔&array[5]是合法的。在C+中在C您可以安全地處理數組結束后的元素-您將得到一個有效的指針。所以&array[5]作為一種表達是合法的。

但是,嘗試取消指向未分配內存的指針仍然是未定義的行為,即使指針指向有效地址。因此,試圖取消引用由該表達式生成的指針仍然是未定義的行為(即非法),即使指針本身是有效的。

但在實踐中,我認為它通常不會導致墜機。

編輯:順便說一句,STL容器的end()迭代器通常是這樣實現的(作為指向一個過端的指針),所以這很好地證明了這種做法是合法的。

編輯:哦,現在我看到你并不是真的在問持有指向那個地址的指針是否合法,但是獲取指針的確切方式是否合法。我會聽從其他人的意見。


查看完整回答
反對 回復 2019-06-29
  • 3 回答
  • 0 關注
  • 556 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號