2014-09-05 60 views
4

我想查找作爲參數傳遞給函數的整數數組的大小。 這裏是我的代碼查找作爲函數參數接收到的整數數組的大小c

void getArraySize(int arr[]){ 
    int len = (sizeof(arr)/sizeof(arr[0]) 
    printf("Array Length:%d\n",len); 
} 

int main(){ 
int array[] = {1,2,3,4,5}; 
getArraySize(array); 
return 0; 
} 

我收到以下警告

sizeof on array function parameter will return size of 'int *' instead of 'int []' [-Wsizeof-array-argument]

請幫助,使我能找到整數數組內的functiongetArraySize 但是我能找到的長度array的大小在main函數內部。由於它作爲pointer傳遞,因此無法在中找到來自with的。

我有一個想法though.I可以在try/catch塊把這個用,直到我得到了segmentation faultC沒有嘗試捕捉,只有jumpers這取決於操作系統)和環。

是否有任何其他方式,我可以用它來找到integer arrayfunction

+0

'int array = {1,2,3,4,5};'??? – 2014-09-05 06:46:14

+0

謝謝@SouravGhosh。 – 2014-09-05 06:46:57

+0

@ArpitSrivastava ??????? – 2014-09-05 07:30:07

回答

16

內的長度你不能這樣做的。當你將一個數組傳遞給一個函數時,它會衰減成一個指向第一個元素的指針,此時它的大小知識就會丟失。

如果你想知道傳遞給函數的數組的大小,你需要前衰變去解決它,並通過與陣列的信息,像:

void function (size_t sz, int *arr) { ... } 
: 
{ 
    int x[20]; 
    function (sizeof(x)/sizeof(*x), x); 
} 
+1

所以你總是必須把它作爲參數傳遞?@ paxdiablo – 2014-09-05 06:53:06

+0

@SunilHari在main函數中'arr'與getArraySize中的不一樣!在函數'getArraySize'聲明中,void'int arr []'與'int * arr'相同,'arr'是一個指針,但不是*數組。 - 這是你得到的編譯器的信息。 – 2014-09-05 06:54:55

+0

@Sunil:是的,你需要評估範圍內的大小,你仍然可以作爲一個數組訪問它,而不是在它衰減之後。 – paxdiablo 2014-09-05 06:55:26

4

數組衰變傳遞給指針。

所以sizeof只能用於查找數組的長度,如果你將它應用到原始數組。

所以你需要傳遞數組的長度作爲獨立的參數函數。

3

將數組傳遞給函數時,其地址作爲指針傳遞給函數。因此void getArraySize(int arr[])相當於void getArraySize(int* arr)

因此,sizeof(arr)產生sizeof(int*),這可能是而不是你想要什麼。

您只能在arr的聲明範圍內安全使用sizeof(arr)/sizeof(arr[0])

在你的情況下,arr的聲明範圍是函數main

+0

好吧如果全局聲明數組,那麼它有可能嗎? – 2014-09-05 06:54:50

+0

@SunilHari:是的,因爲'arr'的聲明範圍將包含該文件中的所有函數。 – 2014-09-05 06:55:32

+0

@SunilHari [全局變量不好](http://c2.com/cgi/wiki?GlobalVariablesAreBad) – 2014-09-05 07:01:59

2

無法確定函數內部的長度。不過你通過arr,sizeof(arr)會一直返回指針大小。所以最好的方法是將元素數量作爲單獨的參數傳遞。

sizeof只適用於查找數組的長度,如果將其應用於原始數組。但是,在數組衰減到指針的時候,sizeof將給出指針的大小而不是數組的大小。

void getArraySize(int arr[]){ 
sizeof(arr); // will give the pointer size 
} 

有一些理由說明爲什麼會發生這種情況。我們怎麼能做到讓C數組知道它的長度?

第一個想法是,當數組傳遞給函數並繼續保持類型系統中的數組長度時,數組不會衰減爲指針。

當您將數組傳遞給函數時,它會衰減指針。所以sizeof函數將返回int *的大小。這是你的編譯器complining關於我們 -

sizeof on array function parameter will return size of 'int *' instead of 'int []' 

正如我建議,當你的數組傳遞給函數需要傳遞的元素數量須─

getArraySize(array, 5); // 5 is the number of elements in array 

搭上了IT副

警告
void getArraySize(int arr[], int element){ 
// your stuff 
} 

計算陣列大小 - 否則一般方式

void getArraySize(int arr[], int len){ 
    // your stuff 
    printf("Array Length:%d\n",len); 
} 

int main(){ 
int array[] = {1,2,3,4,5}; 
int len = (sizeof(arr)/sizeof(arr[0]); // will return the size of array 
getArraySize(array, len); 
return 0; 
}