C 中將陣列作為形參時防止訪問越界的幾種方法

2021-07-10 04:43:50 字數 1045 閱讀 5357

c++中陣列作為形參傳遞給函式時把陣列視為指標,並沒有將陣列的長度資訊傳遞給函式,因而在函式中稍有不慎就會造成陣列記憶體的越界訪問。為了避免這個問題,下面根據書上給的內容做了一點總結和說明。

陣列形參的定義

void func(int *)

void func(int)

void func(int[10])

上面三種形參表示方式都是合法和等價的,可以看到c++將陣列視為指標。另外第三種表示方式看上去在方括號中用乙個常量指定了陣列的長度,但事實上編譯器忽略了這一方式指定的陣列長度,在函式呼叫時即使你給func函式傳遞乙個長度不為10的陣列編譯器同樣可以讓你通過,只不過這在實際執行中可能造成陣列記憶體的越界訪問。(注:這種表示方式要和下面介紹的陣列引用相區分開來)

因為c++並不支援將陣列的長度資訊自動傳遞給函式,所以我們在編寫**時必須採取措施來避免陣列形參帶來的越界訪問問題,下面給出幾種方法

顯示傳遞陣列長度:在函式定義的引數列表中加多乙個表示陣列大小的引數,這種做法比較常見,舉個例子:

void func(int arr, size_t size)

顯示指定陣列開始和結束的位置:這種程式設計風格由標準庫所使用的技術啟發而得,常見於迭代器的使用,舉個例子:

void func(int *begin, int *end)

顯示新增結束的標記:在陣列末尾加多乙個標識元素用來檢測陣列的結束,常見的例子是c風格字串,它是一種字元陣列,並且以空字元null作為結束的標記

void func(char *cstr)

通過引用傳遞陣列:如果形參是陣列的引用,編譯器不會將陣列實參轉化為指標,而是傳遞陣列的引用本身

void func(int (&arr)[10])

int main()

; func(iarray); // error

return 0;

}

不過這種方式編譯器有著嚴格的規定,使用時要注意以下幾點:

C 陣列作為形參傳遞給函式

以下三種形式等價 void function const int arg void function const int arg void function const int arg 10 這裡維度表示期望有10個,並不代表真實為10個以上三個函式等價於將陣列的頭指標const int 型別傳遞給...

C 中陣列作為形參的方法

有兩種傳遞方法,一種是function int a 另一種是function int a 這兩種兩種方法在函式中對陣列引數的修改都會影響到實參本身的值!對於第一種,根據之前所學,形參是實參的乙份拷貝,是區域性變數。但是陣列是個例外,因為陣列的資料太多了,將其一一賦值既麻煩又浪費空間,所以陣列作為引數...

C 中陣列作為形參的方法

有兩種傳遞方法,一種是function int a 另一種是function int a 這兩種兩種方法在函式中對陣列引數的修改都會影響到實參本身的值!對於第一種,根據之前所學,形參是實參的乙份拷貝,是區域性變數。但是陣列是個例外,因為陣列的資料太多了,將其一一賦值既麻煩又浪費空間,所以陣列作為引數...