同樣的數組參數,用sizeof求數組長度為何會產生不同的結果?

void print(int a[]){
printf("%lu ",sizeof(a));
printf("%lu ",sizeof(a[0]));
}
int main(int argc, const char * argv[]) {
// insert code here...
int a[8] = {56,12,45,75,21,32,90,22};
print(a);
printf("%lu ",sizeof(a));
printf("%lu ",sizeof(a[0]));
return 0;
}

結果輸出 8 4 32 4

也就是說數組a在print函數中 sizeof得到8

在main函數中 sizeof得到 32

為何會產生這樣的結果?


參數是沒有定義長度的數組的時候,其實都當成是指針,你是拿不到長度的。要拿到長度只有一種寫法:

template&
void print(int (a)[Fuck])
{
printf("%lu ",sizeof(a));
printf("%lu ",sizeof(a[0]));
}

調用的代碼不需要改


不存在數組參數。數組形式的形參聲明了一個指針。


C語言中,對於一個數組參數進行sizeof操作會返回指針大小而不是數組大小,理論上來說編譯器應該給個warning才對,當然就算真有這個樓主估計也懶得看。。。

這個樓主用了int大小為32位的64位系統,所以分別計算的是

指針大小 64位/8位每位元組 = 8

int類型大小 = 4

數組大小 4位元組int大小*8個元素 = 32

int類型大小 = 4

另外,這位樓主最大的問題不是在什麼都不懂的情況下鑽牛角尖,而是是代碼寫得稀爛並且不覺得它爛。。。沒有基本對美感的追求和對品位代碼的嚮往


請參考KR第二版附錄A7.1 指針轉換

對於某類型T,如果某表達式或子表達式的類型為「T類型的數組」,則此表達式的值是指向數組中第一個對象的指針,並且此表達式的類型將被轉換為「指向T類型的指針「。如果此表達式是一元運算符或sizeof,則不會進行轉換。


傳參的話自覺多傳個size_t len不就得了。


尾隨輪子而來

如果知道sizeof是關鍵字而不是函數、在編譯階段求值而不是運行時,就好理解了


C 專家編程 第四章及第九章,解釋的清清楚楚,來龍去脈,建議參照一下


當這個數組名作為參數傳遞給print這個函數的時候,函數中得到的是一個int的指針。而數組名其實是一個常量指針。sizeof對待這兩者是不一樣的。


對指針 數組名 數組元素分別sizeof運算大小不同的


我就看看,我也發現給同事 培訓時 解釋C 語言 特性 是很麻煩的事,

最後匯成一句 寫代碼 寫簡單的 不要有表面就有歧義的 寫得啰嗦點也沒關係,按照規範填代碼最好


用的是 64 位系統嗎?

32 位下結果是 4 4 32 4

作為參數的 int a[] 和 int *a 是沒有區別的(就我所知),所以 sizeof(a) 只能得到 int *a 這個指針的尺寸。


推薦閱讀:

國外有什麼優秀的c語言入門教學視頻?
僅用C語言可以構造出Python中Dict那種數據結構嗎?
用c語言怎麼實現把一個文件中所有的字元串進行篩選,重複的字元串只留下一個?
C語言中的一個小問題?

TAG:C編程語言 | 指針 |