2015-06-29 55 views
0

如何計算數組中元素的個數數組中元素的個數,如果我不希望傳遞一個元素作爲另一種說法說的數量,計算傳遞給函數

fun(a, sizeof(a)/sizeof(*a)); 

和接收作爲

int fun(int a[], int limit) 
{ 
} 
+1

你不能這樣做,數組衰減到指針時,傳遞給函數 – P0W

+0

請使用搜索功能,有幾十個問題,有答案,問完全相同的東西 –

回答

1

如何可以計算在陣列中元件的數量

你不能。

如果我不希望傳遞的元素數量爲另一種說法

你必須這樣做。

這是C,那裏沒有寶寶保姆或魔杖。如果你需要跟蹤一段信息(比如數組的長度),你必須自己去做。這種明確性是我們使用C的原因,所以我們知道恰恰是發生了什麼,沒有編譯器在背後做着瘋狂的事情。


你會看到宏是這樣的:

#define ARRAY_LENGTH(x) (sizeof(x)/sizeof(x[0])) 

要小心!這僅適用於陣列,其中大小在編譯時已知。它將而不是工作的任意指針。

Linux內核提供了這個宏以安全的方式:

kernel.h

#define ARRAY_SIZE(arr) (sizeof(arr)/sizeof((arr)[0]) + __must_be_array(arr)) 

compiler-gcc.h

/* &a[0] degrades to a pointer: a different type from an array */ 
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) 

compiler.h

#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) 
0

如果這樣做:

main() 
{ 
    int a[]={1,2,3}; 
    fun(a); 
} 
fun(int a[]) 
{ 
} 

您沒有將數組作爲副本傳遞。它只是一個指向第一個元素在內存中的地址的指針。

但它會工作:

#include <stdio.h> 

int fun(int*, int); 

int main(void) 
{ 
    int a[] = {1,2,3,4,5,6,7}; 
    int si=sizeof(a)/sizeof(a[0]); 
    int b=fun(a, si); 
    return 0; 
} 

int fun(int ar[], int si) 
{ 
    int i = 0; 
    printf("size of a==%d\n",si); 
    for(i=0; i<si; i++) 
     printf("%d ",ar[i]); 
} 
0

聲明

int fun(int someArray[]) 

相當於

int fun(int *someArray) 

這是說,只有信息fun接收有關陣列一個指向第一個元素的指針。因此,確定數組大小的唯一方法(除了將大小作爲單獨的參數傳遞外)是將標記放在數組的末尾。標記是一個否則不會在數組中出現的值。

例如,以下代碼使用值-1作爲數組末尾的標記。

#include <stdio.h> 

void fun(int a[]) 
{ 
    int i; 
    for (i=0; a[i] >= 0; i++) 
     printf("%d ", a[i]); 
    printf("\nArray has %d elements\n", i); 
} 

int main(void) 
{ 
    int a[] = {1,2,3,4,5,6,7,-1}; 
    fun(a); 
    return 0; 
} 

這實際上是字符串℃。NUL終止子是如何工作的'\0'充當在字符陣列的端部的定點,使得串長度不具有作爲獨立參數的所有要傳遞的字符串函數。

+0

這可能不用說,這假設你的數組將會從不包含'-1'的* actual *值。 –