當前位置: 華文星空 > 知識

c語言中的sizeof()是如何分辨陣列名和指標的?

2021-06-25知識

那句經典名句怎麽說來著: 偵錯程式下無秘密。

如果你用偵錯程式檢視一下 反組譯 指令,真相就會大白。

來把你的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、但透過函式傳參以後,陣列一律都是變成了地址傳遞,長度資訊就遺失了,和指標就是一樣的,此時編譯器無法再進行分辨。

所以就會出現你看到的那個現象。

如果覺得不錯,幫忙給 @軒轅之風 點個贊哦~