溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++中為什么不要直接使用指針傳遞數(shù)組

發(fā)布時間:2021-11-29 11:33:05 來源:億速云 閱讀:252 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“C++中為什么不要直接使用指針傳遞數(shù)組”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“C++中為什么不要直接使用指針傳遞數(shù)組”吧!

不要直接使用指針傳遞數(shù)組

Reason(原因)

指針+大小風(fēng)格的接口容易引發(fā)錯誤。同時,(指向數(shù)組的)單純指針必須根據(jù)某些慣例被調(diào)用者推測(數(shù)組的)大小。

Example(示例)

Consider(考慮如下代碼):

void copy_n(const T* p, T* q, int n); // copy from [p:p+n) to [q:q+n)

如果q指向的數(shù)組中的元素數(shù)目少于n時會發(fā)生什么?答案是會覆蓋一些可能無關(guān)的內(nèi)存。如果p指向的數(shù)組中元素的個數(shù)少于n會怎么樣?答案是會讀取某些無關(guān)的內(nèi)存。無論哪種情況都是沒有定義的行為,并且可能會引起嚴(yán)重的錯誤。

譯者注:這類錯誤的難點在于發(fā)生問題的位置和引入問題的位置不知道離多遠(yuǎn),還有可能發(fā)生的問題每次都不一樣。

Alternative(可選項)

考慮使用清晰的span:

void copy(span<const T> r, span<T> r2); // copy r to r2
 Example, bad(反面示例)

Consider(考慮以下代碼):

void draw(Shape* p, int n);  // poor interface; poor codeCircle arr[10];// ...draw(arr, 10);

向形參n傳遞10可能引發(fā)錯誤:最一般的慣例是假設(shè)[0:n)(左閉右開),但是哪里也沒有說明。最不好的是對draw()的調(diào)用的編譯行為:這里有一個從數(shù)組到指針的隱式轉(zhuǎn)換(數(shù)組退化)和從Circle到Shape的隱式轉(zhuǎn)換。draw()沒有辦法安全地遍歷該數(shù)組,因為它無法知道元素的個數(shù)。

譯者注:draw函數(shù)既沒有辦法知道數(shù)組的大小,也沒有辦法知道元素的類型。

可選項:使用確保元素數(shù)量的正確性并可以避免危險的隱式轉(zhuǎn)換的支持類。例如:

void draw2(span<Circle>);Circle arr[10];// ...draw2(span<Circle>(arr));  // deduce the number of elementsdraw2(arr);    // deduce the element type and array size
void draw3(span<Shape>);
draw3(arr);    // error: cannot convert Circle[10] to span<Shape>

draw2()(的兩次調(diào)用)會向draw傳遞相同數(shù)量的信息。形成這個結(jié)果的原因是(draw2函數(shù))會推斷它的參數(shù)是Circles的range。

Exception(例外)

使用zstring和czstring來代替C風(fēng)格,以0結(jié)尾的字符串。這種情況下使用來自GSL的str::string_view或者string_span以避免range錯誤。

譯者注:這種情況下使用span會發(fā)生錯誤。

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.

    (簡單)((范圍))任何表達式包含了從數(shù)組到指針的隱式轉(zhuǎn)換,報警。作為例外,允許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.

    (簡單)((范圍))如果對指針的表達式進行算數(shù)操作并產(chǎn)生一個指針值,報警。指針類型為zstring/czstring時可以作為例外。

到此,相信大家對“C++中為什么不要直接使用指針傳遞數(shù)組”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI