那句經典名句怎麽說來著: 偵錯程式下無秘密。
如果你用偵錯程式檢視一下 反組譯 指令,真相就會大白。
來把你的printSize函數再寫一個版本,一個是你原來寫的,一個是直接用指標作為參數:
void
printSize
(
int
a
[
10
])
{
printf
(
"%d
\n
"
,
sizeof
(
a
));
}
void
printSize2
(
int
*
a
)
{
printf
(
"%d
\n
"
,
sizeof
(
a
));
}
int
main
()
{
int
size
=
sizeof
(
a
);
printSize
(
a
);
printSize2
(
a
);
return
0
;
}
我們來看一下,呼叫這兩個函數的反組譯指令有什麽不同?
看到了吧?一毛一樣!
再來看下main函數中這行程式碼的反組譯是什麽樣的:
int
size
=
sizeof
(
a
);
看到了嗎,直接就賦值了,沒有什麽計算的過程。
結論:
1、sizeof是編譯時就確定的,而不是等到執行時,具體是指標還是陣列,編譯器在編譯當前函數時,自然可以根據定義來分辨。
2、但透過函數傳參以後,陣列一律都是變成了地址傳遞,長度資訊就遺失了,和指標就是一樣的,此時編譯器無法再進行分辨。
所以就會出現你看到的那個現象。
如果覺得不錯,幫忙給 @軒轅之風 點個贊哦~