同樣的數組參數,用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語言中的一個小問題?