# include <stdio.h>
int main(void)
{
int a[10] = {0};
printf("sizeof(a) = %d\n", sizeof(a));
return 0;
}
sizeof(a) = 40 ,陣列 a 是 int 型的,每個元素佔 4 位元組,所以長度爲 10 的陣列在記憶體中所佔的位元組數就是 40。而總的位元組數除以一個元素所佔的位元組數就是陣列的長度,如下面 下麪這個程式:
# include <stdio.h>
int main(void)
{
int a[10] = {0};
// 計算陣列中數據長度 :
// 所有數據的位元組數除以一個數據的位元組數即爲數據的個數 :
//int length = sizeof(arr) / sizeof(int); //這句也可以
int cnt = sizeof(a) / sizeof(a[0]);
printf("cnt = %d\n", cnt);
return 0;
}
輸出結果是:
cnt = 10
這樣不管陣列是增加還是減少元素,sizeof(a)/sizeof(a[0]) 都能自動求出陣列的長度。需要注意的是,它求出的是陣列的總長度,而不是陣列中存放的有意義的數據的個數。比如定義一個int型的陣列:
int a[10] = {1, 2, 3, 4, 5};
我們只初始化了五個元素,但是 sizeof(a)/sizeof(a[0]) 求出的是 10,而不是 5。換句話說,我們無法通過 sizeof(a)/sizeof(a[0]) 求出陣列中有多少個有意義的數據。
通過傳遞陣列名參數到子函數中,以獲得陣列長度是不可行的。
#include<stdio.h>
void test(int arr[])
{
int length = 0;
length = sizeof(arr) / sizeof(int);
printf("test_陣列的總位元組數爲: %d\n",sizeof(arr));
printf("test_陣列的長度爲: %d\n",length);
}
int main()
{
// 定義一個整型陣列, 並進行初始化賦值9個數據 :
int arr[] = {1,2,3,4,5,6,7,8,9};
int length = 0;
// 計算陣列中數據長度 :
// 所有數據的位元組數除以一個數據的位元組數即爲數據的個數 :
length = sizeof(arr) / sizeof(int);
printf("main_陣列的長度爲: %d\n",length);
test(arr);
return 0;
}
程式碼分析 :
當將陣列作爲實參傳遞到另一個函數中時, 另一個函數的形參相當於一個指針變數, 因爲將陣列的名作爲實參時, 就是將數位的首地址作爲實參, 所以在test函數中輸出的
sizeof(arr)其實得到的是一個整型陣列的長度(所佔的位元組數), 所以結果是8, 再用其除以int所佔的位元組數(4), 結果就是2 。(64位元) 。32位元機上是1。
因此,獲得陣列長度,只能在陣列定義所在的程式碼區中,採用以上方法,纔可以達到效果。