您好,登錄后才能下訂單哦!
本篇內容主要講解“C++中為什么不要直接使用指針傳遞數組”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++中為什么不要直接使用指針傳遞數組”吧!
指針+大小風格的接口容易引發錯誤。同時,(指向數組的)單純指針必須根據某些慣例被調用者推測(數組的)大小。
Example(示例)
Consider(考慮如下代碼):
void copy_n(const T* p, T* q, int n); // copy from [p:p+n) to [q:q+n)
如果q指向的數組中的元素數目少于n時會發生什么?答案是會覆蓋一些可能無關的內存。如果p指向的數組中元素的個數少于n會怎么樣?答案是會讀取某些無關的內存。無論哪種情況都是沒有定義的行為,并且可能會引起嚴重的錯誤。
譯者注:這類錯誤的難點在于發生問題的位置和引入問題的位置不知道離多遠,還有可能發生的問題每次都不一樣。
Alternative(可選項)
考慮使用清晰的span:
void copy(span<const T> r, span<T> r2); // copy r to r2
Consider(考慮以下代碼):
void draw(Shape* p, int n); // poor interface; poor codeCircle arr[10];// ...draw(arr, 10);
向形參n傳遞10可能引發錯誤:最一般的慣例是假設[0:n)(左閉右開),但是哪里也沒有說明。最不好的是對draw()的調用的編譯行為:這里有一個從數組到指針的隱式轉換(數組退化)和從Circle到Shape的隱式轉換。draw()沒有辦法安全地遍歷該數組,因為它無法知道元素的個數。
譯者注:draw函數既沒有辦法知道數組的大小,也沒有辦法知道元素的類型。
可選項:使用確保元素數量的正確性并可以避免危險的隱式轉換的支持類。例如:
void draw2(span<Circle>);
Circle arr[10];
// ...
draw2(span<Circle>(arr)); // deduce the number of elements
draw2(arr); // deduce the element type and array size
void draw3(span<Shape>);
draw3(arr); // error: cannot convert Circle[10] to span<Shape>
draw2()(的兩次調用)會向draw傳遞相同數量的信息。形成這個結果的原因是(draw2函數)會推斷它的參數是Circles的range。
Exception(例外)
使用zstring和czstring來代替C風格,以0結尾的字符串。這種情況下使用來自GSL的str::string_view或者string_span以避免range錯誤。
譯者注:這種情況下使用span會發生錯誤。
Enforcement(實施建議)
(Simple) ((Bounds)) Warn for any expression that would rely on implicit conversion of an array type to a pointer type. Allow exception for zstring/czstring pointer types.
(簡單)((范圍))任何表達式包含了從數組到指針的隱式轉換,報警。作為例外,允許zstring/czstring類型的指針。
(Simple) ((Bounds)) Warn for any arithmetic operation on an expression of pointer type that results in a value of pointer type. Allow exception for zstring/czstring pointer types.
(簡單)((范圍))如果對指針的表達式進行算數操作并產生一個指針值,報警。指針類型為zstring/czstring時可以作為例外。
到此,相信大家對“C++中為什么不要直接使用指針傳遞數組”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。