陣列作為函式形參時應注意的問題

2022-08-05 05:12:11 字數 1143 閱讀 1979

在利用google c++ testing framework --- gtest編寫test case 時,引起了乙個」奇怪的「問題:

1

intdigitarray =;

2int

size

=sizeof

digitarray

/sizeof

digitarray[0];

將以上**包含在測試函式test()中時,size求取的是正常值。然而在待測函式

**

int

fetchlargestnum(

intnumbers)

}else

return

max;

}

中的呼叫結果length值卻始終為1,導致案例一直執行失敗:

test(fetchlargestnumtest, find_spec_number)

;assert_eq(

9, fetchlargestnum(digitarray));

}

跟蹤除錯後,我認識到是把陣列作為傳入引數時產生了問題,最後發現:

一旦陣列出現在函式傳入引數時,編譯器隱式地生成了乙個指向陣列的第乙個元素的指標。陣列實際上並未被傳入到函式,它馬上退化(decay)為了指向陣列首個元素的指標。這也就造成了在被測試函式的外部和函式內呼叫 sizeof digitarray 計算結果不一致的情況,在函式內部實際求取的是指標本身的大小,而外部得到的是整個陣列的大小。

ps: 陣列形參

1. 從陣列到指標的自動轉化被稱之為「退化」,即陣列退化成指向其首個元素的指標。同樣的事情也發生在函式上,乙個函式型引數會退化為乙個函式指標。然而,不同於陣列丟失邊界的退化,乙個退化的函式指標仍然具有良好的感知能力,可以保持其引數型別和返回型別。

2. 以陣列作為形參產生的問題在於:

a. 陣列的大小必須以形參的方式顯示的編碼,並以單獨的實參傳入或在陣列內部以乙個結束符值作為標識(如字元陣列中的 『\0』 )。

b. 不管陣列如何宣告,乙個陣列通常是由指向其首個元素的指標進行操作的。

鑑於以上兩點,經常採用某種標準的容器(通常是vector 或是 string)來替代對陣列的大多數傳統的用法,並且常優先考慮使用標準容器。

陣列作形參時的注意點

1 對於一維陣列來說,陣列作為函式引數傳遞,實際上傳遞了乙個指向陣列的指標,在c編譯器中,當陣列名作為函式引數時,在函式體內陣列名自動退化為指標。此時呼叫函式時,相當於傳址,而不是傳值,會改變陣列元素的值。例如 void fun int a 若在fun函式中有a i 等語句,那麼對應的陣列元素會被修...

C C 指標作為函式形參注意點

函式形參是指標變數,直接對其賦值 指標相互賦值 只是改變了它的指向,原先傳入的指標指向的內容並沒改變 若要想改動其指向的值,需要通過memcpy或通過指標呼叫賦值 include include include include include include include using namesp...

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

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