C語言獲取陣列長度中的詭異現象

2020-08-10 10:04:04

藉助sizeof()函數

# 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。

因此,獲得陣列長度,只能在陣列定義所在的程式碼區中,採用以上方法,纔可以達到效果。